は、次の関数を考えてみましょう:Func <S、IQueryable <R>>の代わりにQueryable.SelectMany(...)オーバーロードでFunc <S、IEnumerable <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 bar 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