假设我有一个名为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();
上述情况为何如此?
答案 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语句中一样,它必须遵循一定的顺序。 如果你指望在哪里,你基本上不会给他任何值得指望的东西。