2012-07-12 218 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的记录。