【问题标题】:Multiple condition linq多条件 linq
【发布时间】:2016-04-14 20:17:33
【问题描述】:

我在我的应用程序中使用 linq。查询有几个条件.Where(a => !one || a.id == 1)

bool one = false;
bool two = false;
bool three = false;

db.type.Where(w => !one|| w.id == 1).Where(w => !two || w.id == 2).Where(w => !three || w.id == 3).ToList()

但是这个查询给了我结果:

db.type.Where(w => w.id == 1 &&
                  w.id == 2 &&
                  w.id == 3)

我想得到:

db.type.Where(w => w.id == 1 ||
                  w.id == 2 ||
                  w.id == 3)

请帮帮我。我该如何解决这个问题?

【问题讨论】:

  • 链接多个Where 等效于单个Where&& 使用的标准。我猜你可以看到你不能用这种技术模拟||
  • @IvanStoev 我可以用其他技术解决这个问题吗?
  • 您能否提供一些示例输入和输出数据?变量one和id 1之间有关系吗?
  • 使用or 条件构建单个Where。如果它需要是动态的(我猜是这种情况),那么有很多关于 SO 的示例,通常涉及某种谓词表达式构建器。
  • @RePierre变量oneid无关,需要动态添加条件。

标签: entity-framework linq


【解决方案1】:

如果您需要 or where 谓词中的 id,您可以使用 Enumerable.Contains() 方法,如下所示:

var ids = new[]{1, 2, 3};
db.type.Where(w => ids.Contains(w.id));

但是,我假设您想要的是一种为Where 子句动态创建谓词的方法,相信我,使用带有或条件的标志不是这样做的方法; 这种情况不仅会使阅读该代码的其他人哭泣,而且还会导致查询性能不佳。 正确的方法是使用PredicateBuilder。查看这篇文章,了解它应该如何使用以及它的作用。

但有一点需要注意 - 它不适用于 Entity FrameworknHibernate。要为上述 ORM 创建一个,请使用Universal predicate builder 上的此博客文章。

【讨论】:

  • 感谢您的帮助,我正在使用 Universal predicate builder 并且谓词类正在为我提供结果!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
相关资源
最近更新 更多