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

在这里的post中,我学习了如何使用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(); 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目的:

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

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

LINQ to Entities中不支持LINQ表达式节点类型“Invoke”。

后来添加:

还有一个替代谓词构建器,它可以执行相同操作但不使用Expand: http : //petemontgomery.wordpress.com/2011/02/10/a-universal-predicatebuilder/

这应该有帮助..

包含多列的查询

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