给出一个包含多个字段的玩家(用户)表。其中之一就是他们对其他球员的评价。
我想在SQL查询后通过LINQ实现:
SELECT p.*,
(select COUNT(*) from Users where (Rating > p.Rating)) as Rank
FROM Users as p
ORDER BY p.Rating DESC
换句话说,最后一个字段(RANK)应该给出每个用户相对于其他用户的等级:
Id Username ... Rating Rank
43 player41 ... 1002,333 0
99 player97 ... 1002 1
202 player200 ... 1002 1
53 player51 ... 1000,667 2
168 player166 ... 1000,667 2
56 player54 ... 1000 3
32 player30 ... 999,342 4
此尝试不起作用:
var q = from u in Users
orderby u.Rating descending
group u by u.Id into g
select new
{
MyKey = g.Key,
User = g.First(),
cnt = Users.Count(uu => uu.Rating > g.First().Rating) + 1
};
仅为了解您的知识,请注意表Users
已映射到名为User
的EF实体,其中包含' NotMapped'名为Rank的int?
字段,我想手动复制排名:
class User {
...
[NotMapped]
public virtual int? Rank { get; internal set; }
}
答案 0 :(得分:1)
你会想要这样的东西:
var rankedUsers = db.Users
.Select(user => new
{
User = user,
Rank = db.Users.Count(innerQueryUser => innerQueryUser.Rating > user.Rating)
})
.ToList();
这将为您提供一个用户列表及其作为匿名类型的Rank。 然后,您就可以执行以下操作:
List<User> users = rankedUsers.Select(rankedUser=>
{
rankedUser.User.Rank = rankedUser.Rank;
return rankedUser.User;
})
.ToList();
答案 1 :(得分:1)
试试这个:
var q = (from u in Users
select new
{
UserId = u.Id,
UserObj = u,
Rank = (from u1 in Users where u1.Rating>u.Rating select u1).Count()
}).ToList();