我有这样做的愚蠢习惯:
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();
答案 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<>)
是一个模糊的,很少使用的重载。