考慮以下功能:爲什麼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