Linq - Where()。Where()是AND还是OR?

时间:2016-07-27 19:20:47

标签: c# linq lambda

在此查询中:

var test = db.table.Where(x=>x.id == x).Where(x=>x.name == name).ToList();

在SQL语言中使用AND或OR是一样的吗?

3 个答案:

答案 0 :(得分:5)

但你可以使用

var test = db.table.Where(x=>x.id == x && x.name == name).ToList();

var test = db.table.Where(x=>x.id == x || x.name == name).ToList();

答案 1 :(得分:1)

这与分离操作相同:

var numbers = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

var biggerThanThree = numbers.Where(x => x > 3); // [4, 5, 6, 7, 8, 9, 10]

var smallerThanSeven = biggerThanThree.Where(x => x < 7); // [4, 5, 6]

为了简单起见,我不会在这里进行懒惰的执行。

但第二个.Where对已经由第一个.Where过滤的列表进行操作,因此它充当AND

答案 2 :(得分:1)

使用LINQPad,我针对我的一个数据库运行了以下linq表达式:

Personnels.Where(x => x.LastName == "Doe").Where(x => x.FirstName == "John")

这导致以下t-sql:

-- Region Parameters
DECLARE @p0 VarChar(1000) = 'John'
DECLARE @p1 VarChar(1000) = 'Doe'
-- EndRegion
SELECT [t0].[FirstName], [t0].[LastName]
FROM [Personnel] AS [t0]
WHERE ([t0].[FirstName] = @p0) AND ([t0].[LastName] = @p1)

这与此linq表达式生成的t-sm几乎相同:

Personnels.Where(x => x.LastName == "Doe" && x.FirstName == "John")

结果:

-- Region Parameters
DECLARE @p0 VarChar(1000) = 'Doe'
DECLARE @p1 VarChar(1000) = 'John'
-- EndRegion
SELECT [t0].[FirstName], [t0].[LastName]
FROM [Personnel] AS [t0]
WHERE ([t0].[LastName] = @p0) AND ([t0].[FirstName] = @p1)

所以是的,至少在简单的情况下,它与AND相同。然而,恕我直言,使用&amp;&amp;运算符优于链接多个.Where()调用。如果在SQL中不能有多个WHERE子句,则不应该在ORM中链接多个.Where()子句。