如何在LINQ

时间:2017-12-07 12:33:34

标签: entity-framework linq

给出一个包含多个字段的玩家(用户)表。其中之一就是他们对其他球员的评价。

我想在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; }
} 

2 个答案:

答案 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();