C# 如何使用动态OR语句构建Linq查询?
以下代码:C# 如何使用动态OR语句构建Linq查询?,c#,linq,entity-framework,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(); 将允许我使用和表
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();
将允许我使用和表达式的动态列表创建Linq查询
但是,假设我想做同样的事情,只使用或表达式的动态列表?您根本不需要循环:
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);
Func谓词=user=>false;
foreach(项目中的var项目)
{
var predicateCopy=谓词;
predicate=user=>predicateCopy(user)| | someOtherCondition;
}
返回query.Where(谓词);
这将导致相当深的堆栈(一个代理调用另一个代理,等等)。如果特定情况允许您使用任何,那么这通常是一种更好的方法
我希望
Any
在大多数情况下都能正常工作,因为在这些情况下,您有一个项目集合可以与。。。非任何方法适用于“在某些情况下,任何超过18岁的人都可以……在某些情况下,任何姓氏以“G”开头的人“是适当的,等等。虽然这确实回答了这个特定的场景,但有没有更通用的方法?这是我最初的想法,但它给了我一个stackoverflow异常,就好像谓词调用自己而不是前面的一样Func@sternr:嗯,是的-等一下,修理。。。完成。现在,它将为循环的每个迭代捕获不同的变量。嗯,这没有给出一个例外,但它不起作用——它忽略了someOtherCondition@stern:它不应该。。。你能举一个简短但完整的例子来说明这一点吗?