2011-06-01 82 views
4

如果我有以下代码,编译器是否实例化每个结果,还是足够明智地统计表中有多少条对应记录?如果不是,它可能会迫使我在较大的查询中使用不同的策略。LINQ优化问题

from c in context.RendezVous 
where c.RepID == repID && 
    c.DateHeureRV != null && 
    c.DateHeureRV.Value.Date == date.Date 
select c).Count(); 

谢谢!

+0

LINQ只是懒懒地执行代码,例如,只有当你试图访问它的元素。之前的每个表达式只是添加到LINQ查询对象内部构建的动态表达式中。 – 2011-06-01 17:57:47

+2

@Yet:然而,在这种情况下,'.Count()'会立即完全评估查询... – 2011-06-01 17:58:16

+0

@Reed,下次我使用它时很好。 – 2011-06-01 18:03:00

回答

4

这取决于context的类型。

如果这是一个实体框架或LINQ to SQL查询,并contextIQueryable<T>,那么查询被变成了一个SQL查询服务器刚刚返回数作为一个整数上。

如果这是一个内存中的集合(即:IEnumerable<T>),则每个项目都按顺序(Linq到Objects)迭代并计数。

我怀疑前者是真的,因为你提到了“表”,并且你没有使用LINQ to Dataset扩展方法。在这种情况下,你会保持非常高效。

+0

如果源实现'ICollection 'linq-to-objects will只需读取'Count'属性而不是枚举它。 – CodesInChaos 2011-06-01 18:03:10

+2

@CodeInChaos:在这种情况下,不会,因为它必须查看将'ICollection '转换为'IEnumerable ' – 2011-06-01 18:05:48

+0

'的'.Where()'方法的结果(通常,你是对的 - 但是如果仅仅是'context.Count()'没有where子句,那会更好) – 2011-06-01 18:06:06

1

这将执行一个SQL查询,并列出您列出的三个WHERE条件并返回匹配行的计数,它只会实现实际计数而不是每行 - 如果这是您的问题。

+0

原始问题中没有提到SQL - 这可能全都在内存中。 – SethO 2011-06-01 17:58:00

+0

那么桌子上有5个或200个柱子会不会有效果? – Mathieu 2011-06-01 17:58:10

+1

@SethO'context'和'table'这两个词表明这是数据库支持的linq(linq-to-sql,linq-to-entities,...) – CodesInChaos 2011-06-01 18:05:35

2

这将执行(或多或少):

select count(*) 
from rendezvous 
where repid='...' and dateheurerv is not null and dateheurerv='...' 

的LINQ将增加没有真正的开销,查询和次数将被处理的服务器端。