2016-11-15 84 views
0

我在這裏有以下查詢。我如何得到這個SQL的類似linq查詢。實體框架複雜查詢嵌套的C#對象

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) 

我已經使用了下面的linq翻譯,但它在某處失敗。

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; 

回答

1

這裏是LINQ相當於你的子查詢中使用SQL IN (...)條款(不必要的嵌套刪除):

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

和使用查詢它:

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

或者乾脆

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

您在嘗試丟失的是SQL SELECT MAX(PublishedRosterShiftId) as LatestShiftId, DayNumberGROUP BY運算符的結果進行操作,因此在LINQ中Select應該在GroupBy之後。

+0

非常感謝。這有幫助。 :) – Aniket