2016-11-15 1 views
0

Ich habe folgende Abfrage hier. Wie bekomme ich ähnliche linq Abfrage für diese SQL.Entitätsrahmen komplexe Abfrage zu geschachtelten C# -Objekt

SELECT * 
FROM PublishedLineBar 
WHERE PublishedRosterShiftId 
IN (SELECT LatestShiftId FROM 
     (SELECT MAX(PublishedRosterShiftId) as LatestShiftId, DayNumber 
     FROM PublishedRosterShift 
     WHERE employeeid = 14454 
     GROUP BY DayNumber) 
     as ShiftProjection) 

Ich habe unten linq Übersetzung verwendet, aber es ist irgendwo fehlgeschlagen.

var shifts = dbContext.PublishedRosterShifts 
       .Where(h => h.EmployeeId == EmployeeId); 
var inner = shifts 
    .Select(x => new 
     { 
      LatestShiftId = shifts.Max(p => p.PublishedRosterShiftId), 
      DayNumber = x.DayNumber 
     }) 
    .GroupBy(s => s.DayNumber) 
    .Select(g => g.FirstOrDefault()); 
var q = from f in shifts 
    select new 
    { 
     LatestShiftId = shifts.Max(p => p.PublishedRosterShiftId), 
     DayNumber = f.DayNumber 
    }; 
var query = from l in dbContext.PublishedLineBars 
    where inner.Select(s => s.LatestShiftId).Contains(l.PublishedRosterShiftId) 
    select l; 

Antwort

1

Hier ist die LINQ äquivalent Unterabfrage für SQL IN (...) Klausel verwendet (mit unnötiger Verschachtelung entfernt):

var inner = dbContext.PublishedRosterShifts 
    .Where(s => s.EmployeeId == EmployeeId) 
    .GroupBy(s => s.DayNumber) 
    .Select(g => g.Max(s => s.PublishedRosterShiftId)); 

und die Abfrage sie mit:

var query = from l in dbContext.PublishedLineBars 
      where inner.Contains(l.PublishedRosterShiftId) 
      select l; 

oder einfach

var query = dbContext.PublishedLineBars 
    .Where(l => inner.Contains(l.PublishedRosterShiftId)); 

Was Sie in Ihrem Versuch fehlt ist, dass in SQL SELECT MAX(PublishedRosterShiftId) as LatestShiftId, DayNumber auf das Ergebnis der GROUP BY-Operator funktioniert, daher in LINQ Select sollte nach GroupBy sein.

+0

Vielen Dank. Das hat geholfen. :) – Aniket