如果我做一个伯爵,Linq会先检索所有记录吗?

时间:2011-01-18 02:53:09

标签: c# linq-to-sql

假设我有一个名为Population的表来存储一些人口统计数据。在T-SQL中,要获得超过50的人数,我可能会这样做:

SELECT COUNT(*) FROM POPULATION
WHERE AGE > 50

我认为以下linq语句可行,但它只返回零,我不明白为什么。

var count = _context.Population.Count(x => x.Age > 50);

为了让我真正得到计数,我必须做以下任何一种情况:

var count = _context.Populaton.Where(x => x.Age > 50).Count();

var count = _context.Population.Select(x => x.Age > 50).Count();

上述情况为何如此?

3 个答案:

答案 0 :(得分:2)

Linq不会先检索所有记录。它将查询的执行推迟到最后一刻。这样可以优化查询。

http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx

我发现订单有时很重要。希望这会有所帮助。

鲍勃

答案 1 :(得分:1)

在所有情况下,Count()都不会根据从数据库返回的记录在内存中进行计算,但它实际上会更改生成的SQL以包含COUNT语句。生成的TSQL查询的简单版本类似于:

SELECT 
    COUNT(1)
    FROM [dbo].[Population] AS [Extent1]
    WHERE [Extent1].[Age] > 50

当您致电Count()时,会立即执行查询。您的所有查询似乎都是正确的,因此请检查您的数据库,提供程序和上下文,以确保查询正确执行。

答案 2 :(得分:-2)

正确。 就像在任何SQL语句中一样,它必须遵循一定的顺序。 如果你指望在哪里,你基本上不会给他任何值得指望的东西。