このクエリは壊れる可能性があります(正確にはこれであり、はるかに複雑な実際のクエリではありません:-))
IQueryable<atype> query = a;
IQueryable<btype> query2 = from a1 in query
join join b1 in b on a1.id1 equals b1.id1
select b1;
IQueryable<ctype> query3 = from b1 in query2
join join c1 in c on b1.id1 equals c1.id1
select c1;
これらはそれぞれ、次のような署名を持つメソッドに入れることができます。
IQueryable<ctype> JoinQuery2(IQueryable<btype> query2)
{
IQueryable<ctype> query3 = from b1 in query2
join join c1 in c on b1.id1 equals c1.id1
select c1;
return query3;
}
このタイプのクエリは、結合するたびに「古い」タイプを破棄するため、簡単に壊れる可能性があります (したがって、 の最後にquery2
は のみがありselect b1
、 はありませんselect a1+b1
)。両方のオブジェクトを保持する必要がある場合は、匿名オブジェクトである必要があり、匿名オブジェクトであるためnew { a1, b1 }
渡すことができないため、実行できません。
アナライザーはメソッドの完全なチェーンを認識しないため、単にクエリを複数の変数に分割するだけで NPR の問題が解決することに注意してください。
var query2 = from a1 in a
join join b1 in b on a1.id1 equals b1.id1
select b1;
var query3 = from b1 in query2
join join c1 in c on b1.id1 equals c1.id1
select c1;
この場合、次のような匿名オブジェクトを使用することもできます
var query1 = from a1 in a
join join b1 in b on a1.id1 equals b1.id1
select new { a1, b1 };
var query3 = from a1b1 in query2
join join c1 in c on a1b1.b1.id1 equals c1.id1
select new { a1b1.a1, a1b1.b1, c1 };
等々。