[asp.net-mvc]ASP.Net MVC Linq 分组查询

标签: Asp.net-MVC Linq
发布时间: 2017/3/25 4:15:26
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我得到最后 20 已更新的记录在数据库中使用下面的代码

var files = (from f in filesContext.Files
                         join ur in filesContext.aspnet_Roles on f.Authority equals ur.RoleId
                         join u in filesContext.aspnet_Users on f.Uploader equals u.UserId
                         orderby f.UploadDate descending
                         select new FileInfo { File = f, User = u, UserRole = ur }).Take(20);

我然后我认为分裂的结果︰

<%foreach(var group in Model.GroupBy(f => f.UserRole.RoleName)) {%>
//output table here

这没关系了,因为每个我的角色呈现的表。不过预计获得整体最后 20 条记录,我怎么能每个角色的最后 20 记录?

所以我会得到︰

UserRole1

最后 20 条记录有关此 UserRole1

UserRole2

最后 20 条记录有关此 UserRole2

UserRole3

最后 20 条记录有关此 UserRole3

解决方法 1:

我能想到的三种可能的方式做到这一点。 首先,所有的角色,然后执行每个角色,将结果聚合到您的模型 Take(20) 查询。 这可能是也可能不是很多不同的查询具体的角色数量取决于你有。 第二,得到所有的结果,然后筛选最后 20 每个视图中的角色。 这可能是一个很大的查询,花大量时间。第三,得到的结果可能会在每个角色至少 20 个条目 (但不能保证) 大一些,然后筛选最后 20 每个视图中的角色。 我可能会使用的第一或第三的选项取决于要 20 个结果多么的重要。

var files = (from f in filesContext.Files
             join ur in filesContext.aspnet_Roles on f.Authority equals ur.RoleId
             join u in filesContext.aspnet_Users on f.Uploader equals u.UserId
             orderby f.UploadDate descending
             select new FileInfo { File = f, User = u, UserRole = ur })
           .Take(2000);


<% foreach (var group in Model.GroupBy( f => f.UserRole.RoleName,
                                     (role,infos) =>
                                         new {
                                               Key = role.RoleName,
                                               Selected = infos.Take(20)
                                             } ))                                           { %>

   <%= group.Key %>
   <% foreach (var selection in group.Selected)
      { %>
        ...
赞助商