7

Linq to Entities が多対 1の関係をleft outer joinではなく に変換するのはなぜinner joinですか? DB 自体に参照制約があり、正しいテーブルにレコードが存在することを保証するため、inner join代わりに使用する必要があります (はるかに高速に動作します)。

関係が0..1 に対して left outer join多ければ、正しいでしょう。

質問

inner joinではなくに変換されるような方法で LINQ を記述することは可能ですかleft outer join。これにより、クエリの実行が大幅に高速化されます...以前に eSQL を使用したことがありませんが、この場合に使用するのが賢明でしょうか? それは私の問題を解決しますか?

編集

バックグラウンドで使用しているテクノロジーを含めるようにタグを更新しました。

  • エンティティ フレームワーク V1
  • Devart dotConnect for Mysql
  • MySql データベース

Microsoft SQLサーバーで同じことが当てはまるかどうかを誰かがテストできれば、これがDevartの問題なのか、それとも一般的なL2EF機能なのかについての洞察も得られます...しかし、ここではEFが原因だと思います.

4

1 に答える 1

2

私はエンティティ フレームワーク プロバイダーに少し取り組み、それを見てきました。この状況ではプロバイダー自体に選択の余地はないと思います。コマンド ツリーはエンティティ フレームワークによって作成され、SQL を構築するためにプロバイダーに提供されます。これは完全な推測ですが、その状況で LEFT OUTER 結合が生成される理由は、エンティティ フレームワークが参照制約がデータベースに存在することを本当に認識していないためかもしれません。たとえば、データベースから作成されたエンティティ モデルをいじり、データベースが何をしているかを反映しない制約を追加/変更することができます。おそらくこの理由で、設計者は安全にプレイし、「万が一に備えて」LEFT OUTER 結合を作成することを選択しました。

それでも、内部結合を取得できると思います。たとえば、次の場合、プロバイダーは LEFT OUTER 結合を構築します。

var res2 = from a in ent.answers
           select new
           { a.Answer1, a.user.UserName };

ただし、次の結果は INNER 結合になります。

res2 = from a in ent.answers
       join u in ent.users
       on a.UserID equals u.PK
       select new { a.Answer1, u.UserName };

また、次のエンティティ SQL は内部結合を生成しました。

ObjectQuery<DbDataRecord> dr = ent.CreateQuery<DbDataRecord>( 
         "SELECT a.answer1, u.username " +
         "FROM answers as a inner join users as u on a.userid = u.pk" );
于 2010-03-26T18:59:54.730 に答える