IQueryable vs IEnumerable ...扩展方法

时间:2012-05-14 20:32:05

标签: extension-methods ienumerable iqueryable asqueryable

说真的,我必须遗漏一些简单的东西。任何帮助将不胜感激。

以下是该方案: 1)创建一个名为DoSomething的IQueryable扩展方法,该方法具有适当的签名(IQueryable,int x,int y)。 2)使用与IQueryable相同的签名创建名为DoSomething的IEnumerable扩展方法,EXCEPT接受/返回IEnumerable而不是IQueryable。 3)在IEnumerable扩展方法中,将enumerable转换为Queryable(AsQueryable)并尝试调用IQueryable.DoSomething方法。

出于某种原因,上面的场景似乎是对IEnumerable扩展方法而不是IQueryable进行递归调用。我不明白为什么。

据我所知,IQueryable扩展了IEnumerable;但是,.NET扩展似乎检测并正常工作。例如,variable.AsQueryable()。Take(1)将至少通过intellisense(和ReSharper)调用Queryable扩展,而不是Enumerable扩展。当我自己编写时,它似乎不起作用并且创建了一个无限循环。

1 个答案:

答案 0 :(得分:0)

我相信答案是它的效果正如您描述的那样好。这是我的小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

如果你能提供一个更具体的例子,那么我们可能会发现一些导致问题的事情。