2016-11-15 2 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

は(削除、不要なネスティングとの)SQL IN (...)句に使用するあなたのサブクエリのLINQと同等です:

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

あなたが試みていないのは、SELECT MAX(PublishedRosterShiftId) as LatestShiftId, DayNumberGROUP BY演算子の結果で動作するため、LINQのSelectGroupByの後になるはずです。

+0

ありがとう。それが助けになりました。 :) – Aniket

関連する問題