说到作为一个非C#精明的程序员,我很好奇为评估义的皇宫查询如下:

var people = from p in Person
             where p.age < 18
             select p

var otherPeople = from p in people
                  where p.firstName equals "Daniel"
                  select p

假设 Person 是ADO实体,定义了 agefirstName 领域,什么会这样从一个数据库的角度来看?具体而言,会的 people 查询的运行产生的一个结构存储器,其后将进行查询的 otherPeople 查询?或者将该建筑的 otherPeople 仅仅是拉有关的数据的查询 people 然后产生的新数据库-凝视查询?所以,如果我迭代过这些查询中,有多少SQL发言将执行?

有帮助吗?

解决方案

他们可组合.这是可能的,因为皇宫的查询实际上表(代码数据的数据),这皇宫的提供者就像皇宫-对-SQL可以评估和产生相应的SQL。

因为皇宫的查询都懒洋洋地进行评估(例如不会得到执行,直到你迭代该元素),代码表明不会实际上接触该数据库。不直到你迭代otherPeople或人将SQL得到产生和执行。

其他提示

是的,所得到的查询是组成。它包括满在条款。打开SQL分析和尝试看看自己。

皇宫不过表达的树木。第一个皇宫的声明产生一个表达树;它不执行查询。第二皇宫发言的基础上表达的树创建的第一个。该声明只有执行时一一列举所得的收集。

var people = from p in Person
             where p.age < 18
             select p

翻译:

SELECT [t0].[PersonId], [t0].[Age], [t0].[FirstName]
FROM [dbo].[Person] AS [t0]
WHERE [t0].[Age] < @p0

在那里@p0获取发送过为18

var otherPeople = from p in people
                  where p.firstName equals "Daniel"
                  select p

翻译:

SELECT [t0].[PersonId], [t0].[Age], [t0].[FirstName]
FROM [dbo].[Person] AS [t0]
WHERE [t0].[FirstName] = @p0

在那里@p0获得通过的"丹尼尔"

var morePeople = from p1 in people
                 from p2 in otherPeople
                 where p1.PersonId == p2.PersonId
                 select p1;

翻译:

SELECT [t0].[PersonId], [t0].[Age], [t0].[FirstName]
FROM [dbo].[Person] AS [t0], [dbo].[Person] AS [t1]
WHERE ([t0].[PersonId] = [t1].[PersonId]) AND ([t0].[Age] < @p0) AND ([t1].[FirstName] = @p1)

在那里@p0是18、@p1是"丹尼尔"

有疑问时,呼ToString()上你的IQueryable或给予一种形式的属性的日志的财产。

peopleotherPeople 含有类型的对象 IQueryable<Person>.

如果你迭代过两者,它将同时运行两个查询。如果你只迭代 otherPeople, 它会跑的预期查询,其中两个条款。

如果你这样做 .ToList()people 和使用的返回 List<Person> 在第二次查询,而不是人民,它成为皇宫-对的对象并没有SQL执行。

这种行为被称为延迟执行。这意味着没有查询是这样做,直至它是必要的。在执行之前,他们只是表达的树木,得到操纵,以制定最后的查询。

这些查询将要执行的时候,你会尝试访问的最终结果。你可以尝试图原SQL产生的从属性的目属性。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top