[英]Why is IQueryable lacking all the extension methods that IQueryable<T> has?
與IEnumerable
vs IEnumerable<T>
。 這是疏忽嗎? 或者是有,當你沒有指定類型,使得實現擴展的問題等.Count()
.Where()
等是不可能的?
來自文檔 :
IQueryable接口旨在由查詢提供程序實現。 它只應由也實現
IQueryable<T>
提供者實現。 如果提供程序也未實現IQueryable<T>
,則不能在提供程序的數據源上使用標准查詢運算符。
IEnumerable
是.NET沒有泛型的時代的神器(我當然不是說它已被棄用)。 它一直是為了向后兼容,在泛型之后,因此引入了IEnumerable<T>
。 IQueryable
始終如一地保持一致性。 基本上,鑒於現在存在泛型,並且鑒於其優點,它使得僅在通用接口上實現這些擴展變得有用。 使用Cast<T>
可以始終將非泛型的轉換為通用的
不,這不是疏忽。 大多數擴展IQueryable<T>
和IEnumerable<T>
需要知道項的類型。 顯然,像Count()
或Any()
可以在非泛型接口上工作,但它可能會讓人感到困惑。 因此,適用於非泛型接口的唯一方法是使它們通用的方法( Cast<T>()
和OfType<T>()
)。
這可能是一個深思熟慮的決定而不是疏忽,因為IEnumerable\\IQueryable
總是可以使用Cast
方法轉換為IEnumerable\\IQueryable<object>
。
這為調用者帶來了很小的開銷,但是可以節省兩次實現的擴展,例如, Where
需要通用和非通用版本的地方:
public static IEnumerable Where(this IEnumerable source, Func<object, bool> predicate) { ... }
public static IEnumerable<T> Where<T>(this IEnumerable<T> source, Func<T, bool> predicate) { ... }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.