IQueryable和IEnumerable中.Count()的区别

时间:2013-03-11 15:04:07

标签: c# linq entity-framework

我有传递给函数的对象列表,我想要计算它们。 当我使用IQueryable()时,它不会将它们计算正确,但是当我使用IEnumerable()时,它会将它们计为好。

public int functCount(IQueryable<MyObject> myLisfOfObjects)  
{
    int numberOfItems = myListOfObjects.Count(o => o.isSet); //isSet is bool property in my object
    return numberOfItem;
}

在第一次调用时,它返回正确的项目数,但是当我在列表中的某些元素中更改isSet属性时,它返回与第一次调用相同的数字。

public int functCount(IEnumerable<MyObject> myLisfOfObjects)  
    {
        int numberOfItems = myListOfObjects.Count(o => o.isSet); //isSet is bool property in my object
        return numberOfItem;
    }

但是当我将代码更改为此时,它每次都返回正确的计数。

任何人都可以解释我的区别,为什么会发生这种情况?

1 个答案:

答案 0 :(得分:4)

由于您传递给这些函数中的任何一个都不会导致编译错误,因此可以安全地假设它是IQueryable。这意味着.Count()将被重新评估为SQL语句并针对数据库运行(忽略您认为在内存中所做的任何更改)。 然而,在.Count()上调用IEnumerable会调用完全不同的方法,该方法只会返回内存中集合的计数。

换句话说,IEnumerable<T>.Count()IQueryable<T>.Count()是两种完全不同的方法,可以做不同的事情。