IQueryable vs IEnumerable 和对象知道它是哪个子类的多态性
IQueryable vs IEnumerable and polymorphism where an object knows which subclass it is
当使用 IEnumerable
显式声明查询类型时,例如
IEnumerable<string> q =
from c in db.Customers
select c.ContactName;
var q2 = q.Where(s => s.StartsWith(start));
return q2;
查询将使用 Enumerable.where
。为什么查询不知道是IQueryable
而使用Queryable.where
?
这似乎与 OOP 概念相矛盾,在 OOP 概念中,用父类型声明的子对象应该知道它实际上是子类型并使用子类型的方法。
IEnumerable<T>
上的 .Where
方法是 extension method。
因此,它不能虚拟。只有虚拟方法表现出您所期望的多态性
当使用 IEnumerable
显式声明查询类型时,例如
IEnumerable<string> q =
from c in db.Customers
select c.ContactName;
var q2 = q.Where(s => s.StartsWith(start));
return q2;
查询将使用 Enumerable.where
。为什么查询不知道是IQueryable
而使用Queryable.where
?
这似乎与 OOP 概念相矛盾,在 OOP 概念中,用父类型声明的子对象应该知道它实际上是子类型并使用子类型的方法。
IEnumerable<T>
上的 .Where
方法是 extension method。
因此,它不能虚拟。只有虚拟方法表现出您所期望的多态性