以前の質問 (パラメーターなしのコンストラクターとイニシャライザーのみが 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()
ですから、私の質問は、匿名型を作成しなくても機能するのはなぜですか? また、匿名型を作成しようとすると例外が発生するのはなぜですか? この例外を引き起こすメカニズムは何ですか?