2011-05-22 26 views
2

在这种情况下:的LINQ后者处理行为

var allCustomers = from c in customers select c; 
var oldCustomers = from o in allCustomers where o.age > 70 select o; 

威尔其中条款范围的数据库?

+0

注意:这是linq到sql – Eduardo 2011-05-22 00:21:00

+0

您是否尝试过运行它? – ChrisWue 2011-05-22 00:29:14

回答

2

我想你的意思:

var oldCustomers = from o in allCustomers where o.age > 70 select o; 

是的,它会到达数据库。

尝试使用LINQPad查看生成的SQL代码。这里有一个例子:

我有了领域的Actor表:

Id | Name | Age

代码:

var x = from c in Actors where c.Name.Contains("a") select c; 
var y = from c in x where c.Age > 0 select c; 

被翻译成:

-- Region Parameters 
DECLARE @p0 Int = 0 
DECLARE @p1 NVarChar(3) = '%a%' 
-- EndRegion 
SELECT [t0].[Id], [t0].[Name], [t0].[Age] 
FROM [Actor] AS [t0] 
WHERE ([t0].[Age] > @p0) AND ([t0].[Name] LIKE @p1) 

所以你可以看到它是如何将两个查询混合在一起的。请记住,IEnumerables是懒惰的,所以你除非必须知道它们的元素(因为你遍历它们,或者因为你做了.Count()来看看有多少项等),它不会执行任何查询/操作。

+0

所以 var allCustomers = from c in customers select c; 没有达到数据库呢? – Eduardo 2011-05-22 00:36:34

+0

@Eduardo不,它没有。它将在必要时到达数据库。在我的例子中,'x'和'y'都不会到达数据库,但是当你遍历'y'的元素或其他东西时,它会执行查询。这就是我所看到的它产生的SQL。 – 2011-05-22 00:39:04

+0

正确。直到你真正迭代所有客户数据库将被查询 – 2011-05-22 00:39:23