Linq什么时候返回算什么选择?

时间:2011-09-17 15:51:08

标签: linq linq-to-sql return

我有这样做的愚蠢习惯:

return 
    (from c in db.tblUserAlerts 
     where c.userID == UserID && !c.hasRead  
     select new { c.ID }).Count();

c.ID更好地归还整个c记录是否更好(节省内存)?例如:

return 
    (from c in db.tblUserAlerts 
     where c.userID == UserID && !c.hasRead 
     select c).Count();

2 个答案:

答案 0 :(得分:5)

我认为问题在于数据必须经历多少转型。对于你想要做的事情,我认为效率最高的是:

return db.tblUserAlerts.Count(c=>c.userID == UserID && !c.hasRead);

因为您实际上只是通过1种方法运行数据,而不是复制或转换数据,只计算与谓词匹配的内容。

编辑:我再次看了你的标签,看到你有linq-to-sql。如果您使用的是查询提供程序(如LINQ to SQL),则会转换查询。我猜想linq-to-sql查询翻译器会转换为:

SELECT count(c.ID) FROM tblUserAlerts WHERE c.userID == 'UserID' AND NOT c.hasRead

在这种情况下,不应该有任何速度差异,除了LINQ-to-SQL可能需要在翻译查询时做更多的工作,因为表达式树中有更多。速度差异几乎可以忽略不计。我上面的原始答案更适用于LINQ-to-Objects。使用LINQ-to-SQL除非你对任何速度降低过度敏感(即你在紧密循环中运行了数千次),它们应该大致相同。

答案 1 :(得分:1)

编写此查询的最明显方法是建议的。

return db.tblUserAlerts.Count(c=>c.userID == UserID && !c.hasRead); 

在这种情况下,SQL可以执行COUNT (1) WHERE...

你的选择不太可能花费或获得任何东西 - 它被翻译成SQL,而COUNT(*)COUNT(id)的执行差异将很小(如果它存在的话) ),COUNT(id)COUNT(1)的执行差异也是如此。但为什么写代码什么都不做?没有必要选择任何

你要问

,这似乎很奇怪
  

是否更好(节省内存)将c.ID返回到整个c记录?

但随后发表评论

  

这是一个好主意,但我更喜欢像上面那样写出来

您是否希望编写“节省内存”的高效,干净的代码,或者您是否希望根据您的偏好编写而没有明显的原因?更少的代码是更清晰的代码 - 它不像.Count(Exp<>)是一个模糊的,很少使用的重载。