0

最初に EF5 とコードを使用してプロジェクトを作成しています。

私のオブジェクト設計では、「独立した関連付け」を使用しました。この場合、プロパティ「FarmWhereCowLives」は「独立した関連付け」です。

public class Cow

{

     public int CowId
     public string Name
     public DateTime Birthday
     public Farm FarmWhereCowLives
}

public class Farm

{

     public int FarmId
     public string Name
     public string Suburb
}

しかし、特定の農場の最新の牛を選択するようにエンティティ フレームワークに依頼するクエリを実行すると、農場 ID を渡すことができます。たとえば、次のようになります。

_dbset.AsQueryable().Where(c => c.FarmWhereCowLives.FarmId == 1).OrderByDescending(c => c.Birthday).Take(1).Single()

(関連する場合に備えて汎用リポジトリを使用していますが、そうは思いません)

実行される sql (SQL プロファイラで確認できます) が複雑すぎるように見えますか?

例えば

SELECT TOP (1) 
[Project1].[CowId] AS [CowId], 
[Project1].[Name] AS [Name], 
[Project1].[Birthday] AS [Birthday],  
[Project1].[FarmWhereCowLives_FarmId] AS [FarmWhereCowLives_FarmId]
FROM 

(

    SELECT 
[Extent1].[RateChangeId] AS [RateChangeId], 
    [Extent1].[CowId] AS [CowId], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[Birthday] AS [Birthday],  
    [Extent1].[FarmWhereCowLives_FarmId] AS [FarmWhereCowLives_FarmId]
FROM [dbo].[Cow] AS [Extent1]
WHERE [Extent1].[FarmWhereCowLives_FarmId] = 1

)  

AS [Project1]

ORDER BY [Project1].[Birthday] DESC'

質問は次のとおりです。

  1. ネストされた選択とは何ですか?
  2. EF がより効率的なクエリを作成しなかったのはなぜですか? たとえば、ネストされた選択なしですか?
  3. 牛オブジェクトの外部キー関連付けを追加する必要がありますか? 適切に記述されたクエリを EF に実行させるために、これを行う必要はありません。

多分私はここで何か間違ったことをしていますか?

乾杯アンドリュー

4

1 に答える 1

0

EF は常にネストされたクエリを使用します。FK の関連付けにもネストされたクエリが使用されると思います。必ずしもクエリが正しくないという意味ではありません。データベースのクエリオプティマイザーは、実行前にクエリを簡素化できます。

于 2012-08-01T07:56:40.090 に答える