考虑以下功能:为什么Queryable.SelectMany(...)重载接受Func <S,IEnumerable <R>>而不是Func <S,IQueryable <R>>?
IQueryable<Bar> foo(IEnumerable<IQueryable<Bar>> sources)
{
return
from source in sources.AsQueryable()
from bar in source
where bar.Xzy == 123
select bar;
}
直觉上,我希望它可以在每个源的上下文中执行的“从...这里......选择”表达。不过,我相信它只会针对源执行“from ... in ...”部分,而不是执行“where ... select”部分作为LINQ-to-Objects查询。最终的结果是SomeTable的所有行将从每个源检索,而不是只匹配“where”条件的那些。
乍一看,我的猜测是,这是因为对SelectMany的调用导致“源”表达式被隐式转换为IEnumerable <Bar>。我不确定实现是什么样子,但是接受Func < S,IQueryable <R> > >而不是合理的,这样where ... select表达式就传递给IQueryable提供者了吗?
“source.SomeTable”的类型是什么?如果将'foo'的返回类型更改为'IQueryable',会发生什么? –
Lee
@Lee,对不起,我认为SomeTable属性在示例中没有意义。我将“source.SomeTable”改为“source”。我认为将返回类型更改为IQueryable不会更改查询的行为。 –
Aaron
返回类型应做出不同,因为'IEnumerable'重载返回'IEnumerable ',而'IQueryable'重载返回'IQueryable '。因此,如果返回类型更改为“IQueryable ”,并且选择了“SelectMany”的IEnumerable超载,那么您的函数将无法编译。 –
Lee