5

以前の質問 (パラメーターなしのコンストラクターとイニシャライザーのみが LINQ to Entities でサポートされています) に続いて、まだ質問があります。何が起こっているのか、なぜあるケースではうまくいくのか、別のケースではうまくいかないのかを理解したいだけです。

Linq to entities クエリで文字列パラメーター (クエリ文字列パラメーターなど) をキャストする場合は、Guid.parse(request.querystring("param") の代わりに new Guid(request.querystring("param")) を使用する必要があります。 "))。Linq はこれを SQL に変換できないため、Guid.parse は例外をスローします。

私は自分のコードでこの手法を頻繁に使用していますが、うまくいきます。

dim lstResult = DB.MyTable.Where(function(f) f.key = new Guid(request.querystring("param"))).toList()

しかし、Linq クエリを使用して匿名型を作成しようとすると、例外がスローされます。

dim lstResult = DB.MyTable.Where(function(f) f.key = new Guid(request.querystring("param"))).Select(function(f) new With { .guid = f.guid, .name = f.name }).toList()

スローされる例外は次のとおりです。

LINQ to Entities では、パラメーターなしのコンストラクターと初期化子のみがサポートされています。

私ができる (またはすべき) ことは、事前に Guid パラメーターを宣言することです (そして、それはおそらく良い習慣です) クエリでそれを使用するよりも。それが動作します:

dim myGuid = Guid.parse(request.querystring("param"))
dim lstResult = DB.MyTable.Where(function(f) f.key = myGuid).Select(function(f) new With { .guid = f.guid, .name = f.name }).toList()

ですから、私の質問は、匿名型を作成しなくても機能するのはなぜですか? また、匿名型を作成しようとすると例外が発生するのはなぜですか? この例外を引き起こすメカニズムは何ですか?

4

2 に答える 2

0

これは素晴らしい質問です。ただし、ここで魔法を行っているのがプロバイダーなのかコンパイラなのかを知りたいと思っています。まず、request.querystring("param")干渉していないことを確認するために、LINQ の外に移動します。

干渉していない場合は、おそらく IL を見て、[動作する最初のインスタンスで] コンパイラがコードを揺らしているかどうかを確認し、Guid ステートメントの値がリテラルとして LINQ ステートメントに挿入される前に計算されるようにします。匿名型が含まれている場合、2番目のインスタンスで同じことを行います...

于 2013-06-01T14:01:30.150 に答える