Linq 如何使用 OR

本文关键字:OR 何使用 Linq | 更新日期: 2023-09-27 18:36:07

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

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

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

我有一个实体 A,其中包含子表 B 的集合,因此我想从 A 返回行,其中 A.x = 1 或 B.y = 1。

Linq 如何使用 OR

你需要使用一个

_collection.Where(x => x.ByIdA() || x.ByIdB());

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

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

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

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

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

_something.Entity.Where(x => IsA(x) || IsB(x))

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

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

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

var result = list.Where(a => a.x==1 || a=>a.Bs.Any(b=>b.y==1));