在这种情况下:的LINQ后者处理行为
var allCustomers = from c in customers select c;
var oldCustomers = from o in allCustomers where o.age > 70 select o;
威尔其中条款范围的数据库?
在这种情况下:的LINQ后者处理行为
var allCustomers = from c in customers select c;
var oldCustomers = from o in allCustomers where o.age > 70 select o;
威尔其中条款范围的数据库?
我想你的意思:
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()
来看看有多少项等),它不会执行任何查询/操作。
所以 var allCustomers = from c in customers select c; 没有达到数据库呢? – Eduardo 2011-05-22 00:36:34
@Eduardo不,它没有。它将在必要时到达数据库。在我的例子中,'x'和'y'都不会到达数据库,但是当你遍历'y'的元素或其他东西时,它会执行查询。这就是我所看到的它产生的SQL。 – 2011-05-22 00:39:04
正确。直到你真正迭代所有客户数据库将被查询 – 2011-05-22 00:39:23
注意:这是linq到sql – Eduardo 2011-05-22 00:21:00
您是否尝试过运行它? – ChrisWue 2011-05-22 00:29:14