如果我有以下代码,编译器是在实例化每个结果,还是只计算表中有多少对应的记录就足够明智?如果没有,它可能会迫使我对较大的查询使用不同的策略。
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到数据集的扩展方法。那样的话,你会保持高效。
这将执行(或多或少):
select count(*)
from rendezvous
where repid='...' and dateheurerv is not null and dateheurerv='...'
Linq不会给查询增加实际开销,计数将在服务器端处理。
这将使用您列出的三个WHERE条件执行SQL查询,并返回匹配行的计数,它将只实现实际计数,而不是每一行-如果这是您的问题的话。