2016-03-24 9 views
1

私の問題は、このビューを読み込むたびに、アプリケーションが同じクエリをデータベースに249回送信することです。もともと私は遅延読み込みを使用していましたが、クエリの数は2倍でした。エンティティフレームワーク6でのEager Loading時の複数のDBクエリ

上記の249の数値は、このクエリが返す行の数を表します。

私の理解は、この動作を排除すべき結合を作成することです。

このようなクエリの重複を排除する方法を教えてもらえますか?

乾杯!

以下のコードは擬似コードであり、コンパイルを目的としていません。

コントローラー:

var apples = _unitOfWork.Context.Apples 
    .Include(x=> x.AppleTypes) 
    .OrderByDescending(x => x.Id) 
    .Where(x => x.Status == (int)AppleStatusConstants.New 
      && x.IsRejected != true && x.AppleManId != null); 

return View(apples); 

ビュー:垣間見るから

@model IEnumerable<Apple> 

@Html.DisplayNameFor(model => model.AppleTypes.TypeSeason) 
@foreach (var item in Model){ 
     @Html.DisplayFor(modelItem => item.AppleTypes.TypeSeason) 
     } 

SQLトレース:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[Type] AS [Type], 
[Extent2].[Id] AS [Id1], 
[Extent2].[TypeSeason] AS [TypeSeason], 

FROM [dbo].[Apples] AS [Extent1] 
LEFT OUTER JOIN [dbo].[AppleTypes] AS [Extent2] ON [Extent1].[Id] = [Extent2].[Id] 
WHERE (0 = [Extent1].[Status]) AND (NOT ((1 = [Extent1].[IsRejected]) AND ([Extent1].[IsRejected] IS NOT NULL))) AND ([Extent1].[OrgUnitId] IS NOT NULL) 
ORDER BY [Extent1].[Id] DESC 

垣間見るスクリーンショット enter image description here

答えて

1

複数のDBは、それが含まれています、あなたはイーガーロードにベースクエリを、それを告げていないEntity Frameworkの6

に積極的なロードを照会します。

このコード:

var apples = _unitOfWork.Context.Apples 
    .Include(x=> x.AppleTypes) 
    .OrderByDescending(x => x.Id) 
    .Where(x => x.Status == (int)AppleStatusConstants.New 
     && x.IsRejected != true && x.AppleManId != null); 

IQueryable<T>を作成しています。単純な解決策は最後に.ToList()を追加することです。

.Where(x => x.Status == (int)AppleStatusConstants.New 
    && x.IsRejected != true && x.AppleManId != null) 
    .ToList(); 

だからあなたのコードでは、これが犯人である:

@foreach (var item in Model){ 

EFは、一度に1つのエンティティを照会することが原因とされます。

PS:(あなたがobject.cshtmlを上書きしていない限り)以下のステートメントは同じです

@foreach (var item in Model){ 
    @Html.DisplayFor(modelItem => item.AppleTypes.TypeSeason) 
} 

@Html.DisplayFor(m => m) 

@Html.DisplayForModel() 
+0

.ToList(IS)より高価な操作ですか?上級プログラマーの一人が、可能な限りいつでも.ToList()を使用しないように私に奨励します。 –

+0

良い答えはありません。それは単に依存しています。 '時々ある。ToList() 'は正しい解決策であり、そうでないときは時間です。 –

関連する問題