0

LinqPad で次の Linq クエリを使用すると、25 個の結果が返されます。

var result = (from l in LandlordPreferences
          where l.Name == "Wants Student" && l.IsSelected == true
          join t in Tenants on l.IsSelected equals t.IsStudent
          select new { Tenant = t});
result.Dump();

最後に追加.Distinct()すると、5 つの結果しか返されないため、上記を使用すると、各結果の 5 つのインスタンスが得られると推測しています。

私はLinqを初めて使用するので、これはクエリの作成が不十分なためでしょうか? それとも、これはLinqが常に振る舞う方法ですか? 確かにそうではありません - で 500 行を返した場合.Distinct()、それがないと 2,500 行が返されるということですか? これによりパフォーマンスが低下しますか?

4

1 に答える 1

3

これは不十分に構築されたクエリです。外部キーの代わりにブール値で
結合LandlordPreferencesしています。Tenantsしたがって、ほとんどの場合、5人の家主と5人のテナントが学生です。各学生は、土地所有者ごとに返されます:5 x 5 =25。これはデカルト積であり、LINQとは関係ありません。SQLの同様のクエリは同じように動作します。

結果に家主を追加すると(select new { Tenant = t, Landlord = l })、実際には2つの結果が同じではないことがわかります。

どういうわけかクエリを修正できない場合Distinctは、それが唯一の選択肢です。

于 2013-02-19T20:51:26.870 に答える