2012-05-14 168 views
0

严重的是,我必须缺少一些简单的东西。任何帮助将不胜感激。IQueryable与IEnumerable ...扩展方法

这是场景: 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()。至少通过intellisense(和ReSharper)将(1)调用Queryable扩展,而不是Enumerable扩展。当我写我自己的时候,它看起来不起作用,并且创建了一个无限循环。

+0

你的问题现在有点陈旧了。任何更新?提供完整的示例可能有助于实现这一目标。 – DannyMeister

回答

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 

如果您可以提供更具体的例子,那么也许有什么东西,我们可以发现,是造成问题。