IQueryable vs IEnumerable ...扩展方法
Posted
技术标签:
【中文标题】IQueryable vs IEnumerable ...扩展方法【英文标题】:IQueryable vs IEnumerable...Extension Methods 【发布时间】:2012-05-14 20:32:04 【问题描述】:说真的,我必须遗漏一些简单的东西。任何帮助将不胜感激。
这是场景: 1) 创建一个名为 DoSomething 的 IQueryable 扩展方法,并带有适当的签名 (IQueryable, int x, int y)。 2) 创建一个名为 DoSomething 的 IEnumerable 扩展方法,使用与 IQueryable 相同的签名,除了接受/返回 IEnumerable 而不是 IQueryable。 3) 在 IEnumerable 扩展方法中,将 enumerable 转换为 Queryable (AsQueryable) 并尝试调用 IQueryable.DoSomething 方法。
由于某种原因,上述场景似乎对 IEnumerable 扩展方法而不是 IQueryable 进行了递归调用。我不明白为什么。
我了解 IQueryable 扩展了 IEnumerable;但是,.NET 扩展似乎可以检测并正常工作。例如,variable.AsQueryable().Take(1) 将至少通过智能感知(和 ReSharper)调用 Queryable 扩展,而不是 Enumerable 扩展。当我自己编写时,它似乎不起作用,并创建了一个无限循环。
【问题讨论】:
你的问题现在有点过时了。任何更新?提供您的完整示例可能有助于推动这一进程。 【参考方案1】:我相信答案是它可以按照您的描述正常工作。这是我的小 LINQPad 测试程序。诚然,这种情况比您描述的情况稍微简单一些,因为我返回 void 并且不带任何参数。
void Main()
int[] numbers = 1, 2, 3, 4, 5 ;
numbers.AsQueryable().DumpLast<int>();
numbers.DumpLast<int>();
public static class TestExtensions
public static void DumpLast<T>(this IQueryable<T> list)
list.Last<T>().Dump();
public static void DumpLast<T>(this IEnumerable<T> list)
list.AsQueryable().DumpLast<T>();
输出:
5
5
如果你能提供一个更具体的例子,那么我们可能会发现导致问题的某些东西。
【讨论】:
以上是关于IQueryable vs IEnumerable ...扩展方法的主要内容,如果未能解决你的问题,请参考以下文章
IQueryable vs IEnumerable 和多态,其中一个对象知道它是哪个子类
返回 IHttpActionResult vs IEnumerable<Item> vs IQueryable<Item>
IEnumerable<T> VS IList<T> VS IQueryable<T>
返回 IEnumerable<T> 与 IQueryable<T>