如果我有以下代码,编译器是否实例化每个结果,还是足够明智地统计表中有多少条对应记录?如果不是,它可能会迫使我在较大的查询中使用不同的策略。LINQ优化问题
from c in context.RendezVous
where c.RepID == repID &&
c.DateHeureRV != null &&
c.DateHeureRV.Value.Date == date.Date
select c).Count();
谢谢!
如果我有以下代码,编译器是否实例化每个结果,还是足够明智地统计表中有多少条对应记录?如果不是,它可能会迫使我在较大的查询中使用不同的策略。LINQ优化问题
from c in context.RendezVous
where c.RepID == repID &&
c.DateHeureRV != null &&
c.DateHeureRV.Value.Date == date.Date
select c).Count();
谢谢!
这取决于context
的类型。
如果这是一个实体框架或LINQ to SQL查询,并context
是IQueryable<T>
,那么查询被变成了一个SQL查询服务器刚刚返回数作为一个整数上。
如果这是一个内存中的集合(即:IEnumerable<T>
),则每个项目都按顺序(Linq到Objects)迭代并计数。
我怀疑前者是真的,因为你提到了“表”,并且你没有使用LINQ to Dataset扩展方法。在这种情况下,你会保持非常高效。
如果源实现'ICollection
@CodeInChaos:在这种情况下,不会,因为它必须查看将'ICollection
'的'.Where()'方法的结果(通常,你是对的 - 但是如果仅仅是'context.Count()'没有where子句,那会更好) – 2011-06-01 18:06:06
这将执行一个SQL查询,并列出您列出的三个WHERE条件并返回匹配行的计数,它只会实现实际计数而不是每行 - 如果这是您的问题。
原始问题中没有提到SQL - 这可能全都在内存中。 – SethO 2011-06-01 17:58:00
那么桌子上有5个或200个柱子会不会有效果? – Mathieu 2011-06-01 17:58:10
@SethO'context'和'table'这两个词表明这是数据库支持的linq(linq-to-sql,linq-to-entities,...) – CodesInChaos 2011-06-01 18:05:35
这将执行(或多或少):
select count(*)
from rendezvous
where repid='...' and dateheurerv is not null and dateheurerv='...'
的LINQ将增加没有真正的开销,查询和次数将被处理的服务器端。
LINQ只是懒懒地执行代码,例如,只有当你试图访问它的元素。之前的每个表达式只是添加到LINQ查询对象内部构建的动态表达式中。 – 2011-06-01 17:57:47
@Yet:然而,在这种情况下,'.Count()'会立即完全评估查询... – 2011-06-01 17:58:16
@Reed,下次我使用它时很好。 – 2011-06-01 18:03:00