2010-12-10 7 views
2

In ihrem Buch Entity Framework Julie Lerman empfiehlt, verschachtelte Abfragen anstelle von Joins zu verwenden (ein paar Seiten zurückblättern). In ihrem Beispiel füllen Sie 1 Feld auf diese Weise, aber welche ID möchten Sie 2 füllen?Linq: Verschachtelte Abfragen sind besser als Joins, aber was ist, wenn Sie 2 verschachtelte Abfragen verwenden?

Ich habe hier ein Beispiel, in dem ich Vornamen und Nachnamen lieber mit der gleichen geschachtelten Abfrage als mit zwei separaten Werten füllen würde. Ich muss nur die richtige Syntax dafür kennen.

public static List<RequestInfo> GetRequests(int _employeeId) 
{ 
    using (SHPContainerEntities db = new SHPContainerEntities()) 
    { 
     return db.AnnualLeaveBookeds 
      .Where(x => x.NextApproverId == _employeeId || 
      (x.ApproverId == _employeeId && x.ApprovalDate.HasValue == false)) 
      .Select(y => new RequestInfo 
      { 
       AnnualLeaveDate = y.AnnualLeaveDate, 
       Forename = (
        from e in db.Employees 
        where e.EmployeeId == y.EmployeeId 
        select e.Forename).FirstOrDefault(), 
       Surname = (
        from e in db.Employees 
        where e.EmployeeId == y.EmployeeId 
        select e.Surname).FirstOrDefault(), 
       RequestDate = y.RequestDate, 
       CancelRequestDate = y.CancelRequestDate, 
       ApproveFlag = false, 
       RejectFlag = false, 
       Reason = string.Empty 
      }) 
      .OrderBy(x => x.AnnualLeaveDate) 
      .ToList(); 
    } 
} 

Antwort

3

Es ist nichts falsch mit Ihrer Anfrage, aber man kann es in einer Weise schreiben, die viel einfacher, ohne die verschachtelte Abfragen ist:

public static List<RequestInfo> GetRequests(int employeeId) 
{ 
    using (SHPContainerEntities db = new SHPContainerEntities()) 
    { 
     return (
      from x in db.AnnualLeaveBookeds 
      where x.NextApproverId == employeeId || 
       (x.ApproverId == employeeId && x.ApprovalDate == null) 
      orderby x.AnnualLeaveDate 
      select new RequestInfo 
      { 
       AnnualLeaveDate = x.AnnualLeaveDate, 
       Forename = x.Employee.Forename, 
       Surname = x.Employee.Surname, 
       RequestDate = x.RequestDate, 
       CancelRequestDate = x.CancelRequestDate, 
       ApproveFlag = false, 
       RejectFlag = false, 
       Reason = string.Empty 
      }).ToList(); 
    } 
} 

Sehen Sie, wie ich Ihre from e in db.Employees where ... select e.Forename) einfach entfernt und einfach ersetzt es mit x.Employee.Forename. Wenn Ihre Datenbank die richtigen Fremdschlüsselbeziehungen enthält, generiert der EF-Designer erfolgreich ein Modell, das eine Employee-Eigenschaft für die Entität AnnualLeaveBooked enthält. Wenn Sie die Abfrage so schreiben, wird sie deutlich lesbarer.

Ich hoffe, das hilft.

+0

Das funktionierte, ich danke Ihnen sehr. – arame3333

1

versuchen diese

using (SHPContainerEntities db = new SHPContainerEntities()) 
{ 
    return db.AnnualLeaveBookeds 
     .Where(x => x.NextApproverId == _employeeId || 
     (x.ApproverId == _employeeId && x.ApprovalDate.HasValue == false)) 
     .Select(y => 
      { 
       var emp = db.Emplyees.Where(e => e.EmployeeId == y.EmployeeId); 
       return new RequestInfo 
        { 
         AnnualLeaveDate = y.AnnualLeaveDate, 
         Forename = emp.Forename, 
         Surname = emp.Surname, 
         RequestDate = y.RequestDate, 
         CancelRequestDate = y.CancelRequestDate, 
         ApproveFlag = false, 
         RejectFlag = false, 
         Reason = string.Empty 
        }; 
      ).OrderBy(x => x.AnnualLeaveDate).ToList(); 
} 
Verwandte Themen