为什么IQueryable缺少IQueryable <t>所有的扩展方法?</t>

时间:2013-07-10 19:32:13

标签: c# .net linq iqueryable

IEnumerable vs IEnumerable<T>相同。这是疏忽吗?或者,如果您没有指定类型来实现.Count().Where()等实现扩展,那么会出现问题吗?

3 个答案:

答案 0 :(得分:4)

来自docs

  

IQueryable接口旨在供查询提供程序实现。它只应由实施IQueryable<T>的提供商实施。如果提供程序也未实现IQueryable<T>,则不能在提供程序的数据源上使用标准查询运算符。

IEnumerable是.NET没有泛型的时代的工件(我当然不是说它已被弃用)。为了向后兼容,它一直存在于泛型之后,因此引入了IEnumerable<T>IQueryable跟上这一点以保持一致性。基本上,鉴于现在存在泛型,并且鉴于其优点,它使得仅在通用接口上实现这些扩展变得有用。可以使用Cast<T>

始终将非泛型的转换为通用的

答案 1 :(得分:1)

不,这不是疏忽。扩展IQueryable<T>IEnumerable<T>的大多数方法都需要知道项目的类型。显然,像Count()Any()这样的方法可以在非泛型接口上工作,但它可能会让人感到困惑。因此,适用于非泛型接口的唯一方法是使它们成为通用接口的方法(Cast<T>()OfType<T>())。

答案 2 :(得分:0)

这可能是一个深思熟虑的决定而不是疏忽,因为IEnumerable\IQueryable始终可以使用IEnumerable\IQueryable<object>方法转换为Cast

这为调用者带来了很小的开销,但节省了两次实现许多扩展,例如对于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) { ... }