使用LINQ to Entities构建动态OR查询
在LINQ to Entities中,利用延迟执行创建动态查询是很常见的做法。然而,这些查询通常使用AND连接WHERE条件。
为了实现OR逻辑,即使用单个标识符搜索多个属性,您可以利用LINQKit的PredicateBuilder。这允许您动态构建谓词:
<code class="language-csharp">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();</code>
Expand()
方法至关重要,因为Entity Framework无法处理调用表达式。通过调用它,您可以激活LINQKit的表达式访问器类,该类将这些表达式替换为Entity Framework能够理解的更简单的结构。
如果没有Expand()
,则会调用表达式,从而导致异常:“LINQ表达式节点类型“Invoke”在LINQ to Entities中不受支持。”
另一种Predicate Builder
后来,开发了一种通用的谓词构建器,它可以在无需Expand()
的情况下执行相同的任务:
https://www.php.cn/link/451e10de8e2fb18a9f795679b52dc9f6
以上是如何使用 LINQ to Entities 创建动态 OR 查询?的详细内容。更多信息请关注PHP中文网其他相关文章!