IEnumerable <T> .Count()vs List <T> .Count with Entity Framework

nom*_*mad 3 linq extension-methods entity-framework

我正在使用Entity Framework检索项目列表,如果检索到一些项目,我会用它们做一些事情.

var items = db.MyTable.Where(t => t.Expiration < DateTime.Now).ToList();
if(items.Count != 0)
{
    // Do something... 
}
Run Code Online (Sandbox Code Playgroud)

if声明也可以写成

if(items.Count() != 0)
{
    // Do something... 
}
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,这.Count是一个List<T>.Count属性.在第二种情况下,.Count()IEnumerable<T>.Count()扩展方法.

虽然两种方法都能达到相同的效果,但是比另一种更优选吗?(可能性能有些不同?)

D S*_*ley 9

Enumerable.Count<T>(扩展方法IEnumerable<T>)只是调用Count底层类型是一个ICollection<T>,所以List<T>没有区别.

Queryable.Count<T>(用于扩展方法IQueryable<T>)将使用基础查询提供者,它在许多情况下会向下推动计数到实际SQL,其执行比在存储器计数对象更快.

如果应用了过滤器(例如Count(i => i.Name = "John"))或者基础类型不是a ICollection<T>,则枚举该集合以计算计数.

比另一个更优先?

我通常更喜欢使用Count()1)它更便携(底层类型可以是任何实现IEnumerable<T>IQueryable<T>)和2)如果需要,以后添加过滤器更容易.

正如蒂姆在评论中指出的那样,我也更喜欢使用Any(),Count() > 0因为它不需要实际计算项目 - 它只会检查是否存在一个项目.相反,我用!Any()而不是Count() == 0.

  • +1用于未充分利用的`!items.Any()` (3认同)