3

有人可以告诉我如何在 LinQ 语句上做 OR 吗?例如,如果我有两种扩展方法:ByIdA()ByIdB(). 然后我想使用它们类似于:

var yada = _something.Entity.ByIdA().ByIdB();

以上将调用两者并返回 A 和 B 都为真的行。如何编写它以使用 OR 并返回 A 或 B 为真的行?

我有一个带有子表 B 的 Icollection 的实体 A,所以我想从 A 返回行,其中 Ax = 1 或 By = 1。

4

4 回答 4

7

您需要使用单个 where

_collection.Where(x => x.ByIdA() || x.ByIdB());
于 2013-10-18T15:26:31.073 回答
6

要返回两个集合的并集,您可以使用Union运算符。

_something.Entity.ByIdA().Union(_something.Entity.ByIdB())

如果您的集合没有任何共同的元素,您可以使用Concat运算符,因为它不检查重复项,因此更便宜。

于 2013-10-18T15:27:27.240 回答
4

LINQ 可能不是解决这个问题的方法。每个 LINQ 方法都是独立运行的,所以如果你设法让你的 OR 在这样的链中,它将难以阅读,而且肯定难以理解和调试。

您可能只想 OR 老式的方式:

_something.Entity.Where(x => IsA(x) || IsB(x))
于 2013-10-18T15:26:30.193 回答
0

对于您问题的第一部分,可以使用:

var list = _something.Entity;
var result = Enumerable.Union(list.ByIdA(), list.ByIdB());

但是对于第二部分,这似乎是另一个问题,需要澄清这个问题。如果您的意思是每个 A 对象都有一个 B(s) 列表,并且您想要所有可以使用的 AA.x==1对象A.Bs.Any(b=>b.y==1)

var result = list.Where(a => a.x==1 || a=>a.Bs.Any(b=>b.y==1));
于 2013-10-18T17:20:43.720 回答