c# - 如何使用动态 OR 语句构建 Linq 查询?

标签 c# linq entity-framework

以下代码:

var dynamicQuery = from a in _context.Users select a;
string[] args = new string[] { "aa", "bb", "cc" };
foreach (string word in args)
    dynamicQuery = dynamicQuery.Where(x => x.Name.Contains(word));
return dynamicQuery.ToList();

将允许我使用 AND 表达式的动态列表创建 Linq 查询。

但假设我想做同样的事情,只是使用 OR 表达式的动态列表?

最佳答案

你根本不需要循环:

return _context.Users.Where(x => args.Any(word => x.Name.Contains(word)));

编辑:更一般地说,您可以使用:

Func<User, bool> predicate = user => false;
foreach (var item in items)
{
    var predicateCopy = predicate;
    predicate = user => predicateCopy(user) || someOtherCondition;
}
return query.Where(predicate);

这将以相当深的堆栈结束(一个委托(delegate)调用另一个调用另一个委托(delegate)等)。在特定情况允许您使用 Any 的情况下,这通常是更好的方法。

我希望 Any 在大多数情况下都能工作,在这些情况下,您有一个项目集合可能会匹配......非 Any 方法适用于“在某些情况下,任何 18 岁以上的人都可以……在某些情况下,姓氏以“G”开头的任何人都是合适的,等等。

关于c# - 如何使用动态 OR 语句构建 Linq 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7180305/

相关文章:

C# WinUSB 无法在接口(interface)上调用 CloseHandle

c# - 使用无论值如何始终返回 0 的类时出现问题

c# - 如何在另一台计算机上运行包含本地 SQL Server 数据库的 C# 应用程序?

c# - 如何使用 LINQ 使外部表的属性出现在 datagridview 上?

MySQL int 列映射到 Int64。我怎样才能让它映射到Int32(即int)?

c# - Entity Framework 代码优先 : NULL values inserted in database

c# - 如何使 mainMenuStrip 在 Windows 窗体应用程序中看起来有光泽

c# - Int[].Contains 在 EF6 中不起作用

c# - EF-Code First : Unable to create a constant value of type '' . Only primitive types ('such as Int32, String, and Guid' ) are supported in this context

c# - 如何删除没有子类别的类别