IEnumerable<T>
表示 LINQ-to-object,而 IQueryable<T>
则是允许 LINQ-to-SQL 的接口。不过,IQueryable<T>
继承了 IEnumerable<T>
,那么在数据库中如何使用 IQueryable<T>
进行行筛选,而在内存中则可以使用 IEnumerable<T>
进行对象筛选呢?
IEnumerable<T>
表示 LINQ-to-object,而 IQueryable<T>
则是允许 LINQ-to-SQL 的接口。不过,IQueryable<T>
继承了 IEnumerable<T>
,那么在数据库中如何使用 IQueryable<T>
进行行筛选,而在内存中则可以使用 IEnumerable<T>
进行对象筛选呢?
IQueryable<T>
继承了 IEnumerable<T>
,但这与类之间的继承是完全不同的,派生类继承基类的实现。接口只是一种契约,它们背后没有实际的代码。public interface IFoo
{
void Foo(); //its simply a contract, no implementation at all.
}
public interface IBar: IFoo
{
void Bar();
}
public class Foo: IFoo
{
void Foo() { //Foo's sepecific implementation goes here }
}
public class Bar : IBar
{
void Foo() { //Bar's specific implementation goes here }
void Bar() { //implementation goes here }
}
Bar
通过 IBar
实现 IFoo
并不意味着 Foo
和 Bar
之间有任何关系。IQueryable<T>
这个接口如何实现任何东西? - RawlingWhere<T>(this IQueryable<T>, Expression<Predicate<T>> )
Where<T>(this IEnumerable<T>, Predicate<T>)
分辨率规则会优先选择IQueryable扩展而不是基本的Linq扩展,这种神奇的实现是通过Expression<>
参数实现的。
IQueryable<T>
并不保证是基于数据库的。实现IQueryable<T>
接口的具体类会指定数据如何被检索,可以来自数据库、互联网、内存(.AsQueryable()
)等等。 - xanatos