.net Linq到SQL,选择列为max的不同行?

.net Linq到SQL,选择列为max的不同行?,.net,linq,linq-to-sql,distinct,max,.net,Linq,Linq To Sql,Distinct,Max,编辑:简化问题和澄清问题 我正在尝试将此存储过程转换为LINQ语句: SELECT UserID, MAX(RowID) as RowID into #tempa FROM Users WHERE Approved = 1 GROUP BY UserID SELECT (bunch of columns) FROM Users INNER JOIN #tempa ON (Users.UserID = #tempa.UserID AND Users.RowID = #tempa.RowID)

编辑:简化问题和澄清问题

我正在尝试将此存储过程转换为LINQ语句:

SELECT UserID, MAX(RowID) as RowID into #tempa
FROM Users
WHERE Approved = 1 
GROUP BY UserID

SELECT (bunch of columns)
FROM Users INNER JOIN #tempa
ON (Users.UserID = #tempa.UserID AND Users.RowID = #tempa.RowID)
DROP TABLE #tempa
当我运行此存储过程时,我得到了292行。当我尝试将其转换为LINQ时,我会执行以下操作:

IQueryable<User> userQuery = db.Users.Where(x => x.Approved == true);
        userQuery = userQuery.Where((x => x.RowID ==
                        db.Users.Where(u => u.UserID == x.UserID).Max(u => u.RowID)
           ));
         IList<User> users = userQuery.ToList();
我在存储过程中得到了289行

使用LINQ尝试以下操作:

 IQueryable<User> userQuery = db.Users.Where(x => (x.UserAttributes & Convert.ToInt32(UserAttributes.Active)) == Convert.ToInt32(UserAttributes.Active) && x.Approved == true);
        userQuery = userQuery.Where((x => x.RowID ==
                        db.Users.Where(u => u.UserID == x.UserID).Max(u => u.RowID)
           ));
IQueryable userQuery=db.Users.Where(x=>(x.UserAttributes&Convert.ToInt32(UserAttributes.Active))==Convert.ToInt32(UserAttributes.Active)&x.Approved==true);
userQuery=userQuery.Where((x=>x.RowID==
其中(u=>u.UserID==x.UserID).Max(u=>u.RowID)
));
结果是127行


起初我以为是我在子查询中使用了.Max,下面是AD.NET纠正我的,但数字仍然相差很远,我在这里遗漏了什么?我不明白什么…

像这样的东西应该行得通,你也可以从中重构出一些谓词

// Filter the list
var q = from s in userQuery 
    group s by s.UserId into g
     select new {UserId = g.Key, MaxRowId = g.Group.Max(s => s.RowId) } 

// Apply the filter
userQuery = userQuery.Where(i => q.Where(k => k.UserId == i.UserId && k.MaxRowId == i.RowId).Count() > 0).ToList();
 predicate = predicate.And((x => x.RowId == 
                                        db.Users
                                             .Where(u=>u.UserId ==x.UserId)
                                             .Max(u=>u.RowId)
                           ));
您可以尝试以下方法:

var result = from u in db.Users
let max = db.Users.Where(au=>au.UserId == u.UserId).Max(au=>au.RowId)
let maxUId = db.Users.Where(au=>au.UserId == u.UserId && au.RowId == max).Select(au=>au.UserId).FirstOrDefault()
where u.RowId == max && u.UserId == maxUId
select u
对照sql检查(请去掉任何其他条件以进行调试)。
我想我错过了userId部分,您还需要匹配userId,否则它将无法正常工作。我相信您可以使查询更好一些,例如,使用
let
保留具有最高rowid的整个用户对象,然后您可以使用该对象匹配rowid和userid

这里有点不对劲,但可能是我这边的问题,我的LINQ语句中未过滤的结果与SQL中存储过程给我的结果不匹配(我正在尝试从存储过程转移到LINQ)。我的LINQ语句和存储过程返回不同的结果,因此我认为我做错了什么。这不起作用,它说:System.LINQ.IGrouping不包含“Group”的定义,并且找不到接受System.LINQ.IGrouping类型的第一个参数的扩展方法“Group”(是否缺少using指令或程序集引用?)第二个where语句产生错误:委托'System.Func'不接受'1'参数。
var result = from u in db.Users
let max = db.Users.Where(au=>au.UserId == u.UserId).Max(au=>au.RowId)
let maxUId = db.Users.Where(au=>au.UserId == u.UserId && au.RowId == max).Select(au=>au.UserId).FirstOrDefault()
where u.RowId == max && u.UserId == maxUId
select u