之前的文章介绍了一种使用LINQ延迟执行构建动态查询的方法。然而,该查询使用AND条件连接WHERE子句。本文探讨如何调整此方法以改用OR逻辑。
具体目标是创建一个基于用户名、Windows用户名或两者(由提供的IdentifierType枚举确定)搜索用户的查询。修改后的GetUser方法如下所示:
<code>public User GetUser(IdentifierType type, string identifier) { using (var context = contextFactory.Invoke()) { 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(); // 或者 return query.AsExpandable().Where(pred).FirstOrDefault(); } }</code>
实现OR逻辑的关键在于LINQKit库的PredicateBuilder。它允许动态谓词构建,并可以与Entity Framework结合使用。谓词从Predicate.False开始,并根据IdentifierType标志动态修改。
Expand()方法至关重要,因为Entity Framework不支持调用表达式。AsExpandable()激活LINQKit的表达式访问器,将表达式转换为Entity Framework可以处理的形式。如果没有它,将会发生“Invoke”异常。
另一种方法是使用Pete Montgomery的谓词构建器,它执行相同的功能,而无需Expand()。
以上是如何在动态 LINQ WHERE 子句中高效实现 OR 逻辑?的详细内容。更多信息请关注PHP中文网其他相关文章!