3

なぜこれがSystem.NotSupportedExceptionをスローするのですか?

string foo(string f) { return f; }
string bar = "";
var item = (from f in myEntities.Beer
            where f.BeerName == foo(bar)
            select f).FirstOrDefault();

編集:(一種の)物事を説明するMSDNリファレンスは次のとおりです...

正規関数に明示的にマップされていないLINQtoEntitiesクエリでメソッドを呼び出すと、実行時のNotSupportedException例外がスローされます。正規関数にマップされるCLRメソッドのリストについては、「CLRメソッドから標準関数へのマッピング」を参照してください。

http://mosesofegypt.net/post/LINQ-to-Entities-what-is-not-supported.aspxも参照してください

4

3 に答える 3

9

編集:さて、それはへの呼び出しをどうするかわからないので、コードは爆発しますfoo()クエリは式ツリーとして構築され、SQLに変換されます。

式ツリーのトランスレータは、文字列の等式やその他のさまざまなメソッド(たとえばstring.StartsWith)など、さまざまなことを知っていますが、メソッドが何をするのかはわかりませんが、それに関する限り、ブラックボックスです。したがって、SQLに変換することはできません。foofoo()

于 2010-04-27T08:21:53.280 に答える
1

2番目のバージョンは、反復しようとするとすぐに失敗します。句でローカルに定義されたメソッドを使用することはできませんIQueryable<> where(もちろん使用できますが、LINQプロバイダーがそれをSQLに変換しようとすると失敗します)。

于 2010-04-27T08:21:40.367 に答える
1

2番目のクエリでは、実際のクエリは実行されないためです。ToList()はどこにあるかを追加してみてくださいSingleOrDefault()

これはおそらく、SQL生成機能が関数をどう処理するかを決定foo()できないため、関数の出力を生成できないためです。

于 2010-04-27T08:22:08.483 に答える