【发布时间】:2013-08-12 21:17:18
【问题描述】:
我正在使用 Entity Framework 检索项目列表,如果检索到一些项目,我会对它们进行处理。
var items = db.MyTable.Where(t => t.Expiration < DateTime.Now).ToList();
if(items.Count != 0)
{
// Do something...
}
if 语句也可以写成
if(items.Count() != 0)
{
// Do something...
}
在第一种情况下,.Count 是 List<T>.Count 属性。在第二种情况下,.Count() 是IEnumerable<T>.Count() 扩展方法。
虽然这两种方法都达到了相同的结果,但是,是一种比另一种更受欢迎吗? (可能在性能上有一些差异?)
【问题讨论】:
-
Enumerable.Count的优点是以后可以在不破坏代码的情况下更改序列的类型。但请注意Any更好,因为Count()枚举整个序列,如果它不是一个集合,而Any停止在第一个项目。它也更具可读性。 -
@TimSchmelter 但是如果你不改变序列的类型它有缺点:)
-
@lazyberezovsky:唯一的缺点是它经常被使用,即使
Any会更好(见我的编辑)。 -
@lazyberezovsky:那是微优化。除此之外,在返回所有记录的实体框架查询上使用
Count()只是为了知道是否有一条记录,that 确实效率低下。另外,Any建议我想知道是否有一个项目,而不是有多少项目。所以它也更具可读性。 -
重要的是要明白,一旦你把
ToList扔进去,你就不能再享受延迟查询的好处了。您现在使用的是 LINQ-to-Objects,而不是使用 LINQ-to-Entities 提供程序。有许多重要的区别,例如 Count() 推迟到底层实现而不是被转换为 SQL,以及字符串比较不再区分大小写。
标签: linq entity-framework extension-methods