2013-03-11 82 views
0

我有传递给函数的对象列表,我想对它们进行计数。 当我使用IQueryable()时,它没有指望它们是正确的,但是当我使用IEnumerable()时,它会计数它们。IQueryable和IEnumerable中的.Count()之间的区别

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; 
    } 

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

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

+2

您能告诉我们如何给他们打电话,改变他们的价值并回忆他们吗?只用给定的代码很难说。 – 2013-03-11 15:07:33

回答

3

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

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

相关问题