2016-03-24 6 views
1

Mein Problem ist, dass jedes Mal, wenn ich diese Ansicht laden meine Anwendung 249 identische Abfragen an die Datenbank sendet. Ursprünglich verwendete ich Lazy Loading und die Anzahl der Abfragen war doppelt.Mehrere DB-Abfragen beim Eager Laden in Entity Framework 6

Die obige 249 Zahl gibt die Anzahl der Zeilen an, die diese Abfrage zurückgibt.

Mein Verständnis ist, dass .Include erstellt eine Verknüpfung, die dieses Verhalten beseitigen sollte?

Kann mir jemand sagen, wie man diese Doppelarbeit von Abfragen beseitigt?

Prost!

Der folgende Code ist Pseudocode und soll nicht kompiliert werden.

Controller:

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); 

Ausblick:

@model IEnumerable<Apple> 

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

SQL Trace von Glimpse:

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 

Glimpse Screenshot enter image description here

Antwort

1

Mehrere DB-Abfragen, wenn Eager Laden in Entity Framework 6

Sie haben es nicht zu Eager laden sagte der Basis Abfrage, nur es ist Inklusive.

Dieser Code:

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); 

ist ein IQueryable<T> zu schaffen. Die einfache Lösung besteht darin, am Ende .ToList() hinzuzufügen.

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

Also in Ihrem Code, dann ist dies der Täter:

@foreach (var item in Model){ 

Das EF ist Ursachen für eine Einheit zu einer Zeit abzufragen.

PS: Die folgenden Aussagen identisch sind (es sei denn, Sie object.cshtml außer Kraft gesetzt haben)

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

und

@Html.DisplayFor(m => m) 

und

@Html.DisplayForModel() 
+0

Ist .ToList() ein teure Operation? Einer der Senior-Programmierer hier ermuntert mich dazu, .ToList() wann immer möglich zu verwenden –

+0

Es gibt keine gute Antwort. Es hängt einfach davon ab. Es gibt Zeiten, als.ToList() 'ist die richtige Lösung und Zeiten, wenn es nicht ist. –

Verwandte Themen