.net Linq到SQL,选择列为max的不同行?
编辑:简化问题和澄清问题 我正在尝试将此存储过程转换为LINQ语句:.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)
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