2012-07-12 131 views
0

如何將其轉換爲LinQ?在LinQ查詢中轉換SQL查詢

SELECT * 
FROM YourTable 
WHERE id IN (
    SELECT MAX(id) FROM YourTable GROUP BY alarmId, alarmUnit 
    ) 

試圖所以下面遠,但不起作用

var a= from x in YourTable .ToList() 
            group x by new { x.alarmId, x.alarmUnit} into g 
            from x1 in YourTable 
            where x1.ID == (from x2 in g select x2.ID).Max() 
            select x1; 

感謝,

+0

你正在使用哪個框架? Linq2Sql? Linq2EF? Linq2NH? Linq2WTF?你是怎麼得到「Yourtable」變量的(我在猜測答案,但是我希望你會驚訝我) – 2012-07-12 21:33:12

+0

什麼是不準確的? – 2012-07-12 21:36:36

+0

使用LINQ到實體 – user570715 2012-07-12 21:36:45

回答

0

試試這個:

var a= from x in YourTable .ToList() 
     group x by new { x.alarmId, x.alarmUnit} into g 
      select new 
      { 
       alarmId = g.Key.alarmId, 
       alarmUnit = g.Key.alarmUnit, 
       id = g.Max(b => b.id) 
      }; 
+0

這有點奏效,我從每個組中獲取一條記錄,但是選擇最低ID的記錄而不是組中的最大ID記錄? – user570715 2012-07-12 23:27:01

0
var a = from x in YourTable 
     where (
      from y in YourTable 
      group y by new { y.alarmId, y.alarmUnit } into g 
      select g.Max(z => z.ID) 
     ).Contains(x.ID) 
     select x; 

這應該產生以下SQL

SELECT [t0].[ID] AS [ID], [t0].[alarmId] AS [alarmId], ... 
FROM [YourTable] AS [t0] 
WHERE EXISTS(
    SELECT NULL AS [EMPTY] 
    FROM (
     SELECT MAX([t1].[ID]) AS [value] 
     FROM [YourTable] AS [t1] 
     GROUP BY [t1].[alarmId], [t1].[alarmUnit] 
    ) AS [t2] 
    WHERE [t2].[value] = [t0].[ID] 
) 

存在在這種情況下相當於。此外,如果ID字段不是密鑰,則會根據您的原始問題返回所有匹配最大ID的記錄。