EF(4.1)が特定のSQLクエリを生成している理由を理解するのに少し問題があります。ここに行く:次のようにエンティティフレームワークでSQLの問題が発生しました(同じテーブルに複数の結合があります)
基本的に私は、この2つのクラス
public class Rota
{
public int RotaId { get; set; }
public int RotaGroupId { get; set; }
public virtual RotaGroup RotaGroup { get; set; }
public int EmployeeId { get; set; }
public virtual Employee Employee { get; set; }
...
と
public class RotaGroup
{
public int RotaGroupId { get; private set; }
public bool IsCurrentRota { get; set; }
...
ロタのマッピングを持っているのです。
HasKey(r => r.RotaId);
Property(r=>r.RotaId).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Identity);
HasRequired(r => r.RotaGroup).WithMany()
.HasForeignKey(r => r.RotaGroupId)
.WillCascadeOnDelete(false);
HasRequired(r => r.Employee).WithMany()
.HasForeignKey(r => r.EmployeeId)
.WillCascadeOnDelete(false);
...
をOK。ここで、次のLINQクエリ:
SELECT ...columns...
FROM [dbo].[Rota] AS [Extent1]
INNER JOIN [dbo].[RotaGroup] AS [Extent2] ON [Extent1].[RotaGroupId] = [Extent2][RotaGroupId]
LEFT OUTER JOIN [dbo].[RotaGroup] AS [Extent3] ON [Extent1].[RotaGroupId] = [Extent3].[RotaGroupId]
WHERE ([Extent2].[IsCurrentRota] = 1) AND ([Extent1].[MyIgluUserId] = 1
Imはあなたが問題を見ることができます:
_context.Rotas.Include(r => r.RotaGroup)
.Where(r => r.EmployeeId == 1 && r.RotaGroup.IsCurrentRota)
.ToList();
には、以下のSQLを生成します。なぜなぜそれがrotaGroupに参加しているのですか(それはすべきです)、次に左外部結合を行っていますか?さらに、[Extent2](内部結合)の列は使用されません。左側の外部結合ビット([Extent3])からの列のみが使用されます。
残念ながら、SQLはクエリを最適化していません。だから私はこれをまっすぐにしましょう、EFはIncludeのためにLEFT OUTER JOINを使用しています。INNER JOINはWhere?それはひどく奇妙です。また、RotaGroupIdはrotaの必要な外部キーです。なぜ、それはLEFT OUTER JOINを使用していますか? – Umair
多分、それは私のせいです。あなたが見ているのは、私がやっている理由です(r => r.RotaGroup)です。 RotaGroupのIsCurrentRotaプロパティにアクセスします。これにより、RotaGroup.IsCurrentRotaが真であるすべてのrotasを見つけることができます。これは正しい方法ですか? – Umair
これは単にクエリの生成方法です。それはここで解決できる問題ではありません。もしあなたが[connect.microsoft。com](http://connect.microsoft.com/)または[ユーザーの声]の変更要求(http://data.uservoice.com/forums/72025-ado-net-entity-framework-ef-機能の提案) - 私はすでにそれらのいくつかが存在することを期待しています。サポートチケットをお持ちの場合は、MSのサポートを依頼するか、[MSDNフォーラム](http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/threads/)でお問い合わせください。 –