繁体   English   中英

Linq to Entities中的动态where子句(OR)

[英]Dynamic where clause (OR) in Linq to Entities

本文中,我学习了如何使用Linq的延迟执行来构建动态查询。 但是查询实际上是使用WHERE条件的AND串联。

如何使用OR逻辑实现相同的查询?

由于Flags枚举,查询应搜索UsernameWindowsUsername两者

public User GetUser(IdentifierType type, string identifier)
{
    using (var context = contextFactory.Invoke())
    {
        var query = from u in context.Users select u;

        if (type.HasFlag(IdentifierType.Username))
            query = query.Where(u => u.Username == identifier);

        if (type.HasFlag(IdentifierType.Windows))
            query = query.Where(u => u.WindowsUsername == identifier);

        return query.FirstOrDefault();
    }
}

使用LINQKit的 PredicateBuilder,您可以动态地构建谓词

var query = from u in context.Users select u;
var pred = Predicate.False<User>();

if (type.HasFlag(IdentifierType.Username))
    pred = pred.Or(u => u.Username == identifier);

if (type.HasFlag(IdentifierType.Windows))
    pred = pred.Or((u => u.WindowsUsername == identifier);

return query.Where(pred.Expand()).FirstOrDefault();
// or return query.AsExpandable().Where(pred).FirstOrDefault();

这是Expand的用途:

实体框架的查询处理管道无法处理调用表达式,这就是为什么您需要在查询中的第一个对象上调用AsExpandable的原因。 通过调用AsExpandable,您可以激活LINQKit的表达式访问者类,该类将调用表达式替换为Entity Framework可以理解的更简单的结构。

或者:没有它,表达式就是Invoke d,这会导致EF中的异常:

LINQ to Entities不支持LINQ表达式节点类型'Invoke'。

以后添加:

有一个替代谓词构建器,其功能相同,但没有扩展: http : //petemontgomery.wordpress.com/2011/02/10/a-universal-predicatebuilder/

这应该有帮助。

包含多列查询

表格设计中似乎还存在一个基本问题(如果我错了,请纠正我)。 IdentifierType在数据库中的用途是什么?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM