【问题标题】:EF/Code First / Linq --- How to filter a query "loop" but using "OR" [duplicate]EF / Code First / Linq ---如何过滤查询“循环”但使用“OR”[重复]
【发布时间】:2013-04-29 22:35:35
【问题描述】:

通常,当我们有一个包含多个可能过滤器的网格结果时,我们可能会使用类似于此的逻辑:

var query = db.Something;
if(isFilter1 != null)
     query = query.Where(x=>x.Prop1 == isFilter1);
}
if(isFilter2 != null)
     query = query.Where(x=>x.Prop2 == isFilter2);
}
.... etc...
var finalResult = query.ToList();

但现在我想使用这种逻辑,但使用“OR”而不仅仅是“AND”。 我想要实现的“查询的最终结果”的一个简单示例。

var finalResult = db.Something.Where(x => 
           x.Prop1 == null && 
           x.Prop2 != 0 && 
           x.Prop3 == id && 
           (x.Prop4 == "String1" || x.Prop4== "String2" || x.Prop4== "String3"));

【问题讨论】:

  • LINQ to 你在用什么? LINQ 到实体?对象? SQL?
  • @GertArnold 不是重复的问题,至少不是您所指的问题,因为我的问题是学习如何在使用查询访问数据库之前使用循环添加新的 Where 子句。
  • 当您在 ToList() 调用中迭代您的结果集时,您只是在“访问数据库”。您可以动态添加一百万个条件,查询仍然不会运行。只有当您开始处理数据时,才会检索数据。查找“延迟加载”的概念以了解有关此类事物的更多信息。
  • 如果你检查你想要的和 Cuong Le 提议的实际生成的 SQL,你会发现它们是相同的。一个 List.Contains() 和一些 OR 语句在翻译成 SQL 时是完全一样的。 Contains() 方法恰好用于您事先不知道参数数量的实例。
  • @Dryadwoods 正如 Juann 所说,在向数据库添加谓词时,您不会访问数据库。 Linqkit 正在成为此类任务的de facto 标准。动态ORs 的替代方法是使用Unions 扩展您的查询,但这不太有吸引力,因为它产生的查询计划效率较低。

标签: linq


【解决方案1】:

你可以使用Contains方法:

var list = new[] { "string1", "string2", "string3"};

var finalResult = db.Something.Where(x => 
       x.Prop1 == null && 
       x.Prop2 != 0 && 
       x.Prop3 == id && list.Contains(x.Prop4));

【讨论】:

  • 感谢您的回答,但这不是我想要的,ANY 或 INCLUDE 或类似的不是我想要的。
  • @Dryadwoods:我已经编辑了我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 2021-12-09
  • 1970-01-01
  • 2012-09-25
  • 2011-08-29
相关资源
最近更新 更多