繁体   English   中英

Linq排序嵌套表

[英]Linq Sort Nested Table

后续问题:

Linq合并左联接数据

说我有以下数据库表:

Users
-------
UserId (PK)
UserName

Roles
-----
RoleId (PK)
RoleName

UserRoles
---------
UserId (PK)
RoleId (PK)
Users 1-M UserRoles M-1 Roles

使用LinqToSQL,我可以返回以下集合(感谢上一个问题的答复):

[User1], [Role1, Role2, Role3]
[User2], [Role2, Role3] 
[User3], [Role3]

我想尝试的是按角色分类。 如何按角色对结果排序?

澄清度

我有一个网格,当用户单击“角色”列时,行将按该列排序。

因此,启动网格应如下所示:

[User1], [Role1, Role2, Role3]
[User2], [Role2, Role3] 
[User3], [Role3]

然后,如果他们在“角色”列上进行排序,它将看起来像这样

[User3], [Role3]
[User2], [Role2, Role3] 
[User1], [Role1, Role2, Role3]

只需稍微更改原始答案即可:

from u in dataContext.Users
select new { User = u, Roles = u.UserRoles.Select(ur => ur.Role)
                                          .OrderBy(r => r.RoleName) };

(这是假设您要按照结果所包含的角色对结果的每个元素进行排序。如果不正确,请更详细地说明您想要的内容。)

您能不能简单地使用这样的东西?

// users is the collection you already got from Linq2Sql
var usersSorted = from u in users order by u.Roles select u;
int ascending = 1; //set to -1 for descending

from u in Users
orderby u.Roles.Count * ascending
select new { u, u.Roles.OrderBy(x => x.RoleName) }

您的查询将需要满足多对多的需求(未显示)。

嘿@zzz,到目前为止,我所看到的答案似乎表明如何对每个用户的行进行排序,但是,如果我理解您的澄清,您确实希望这样做,但是您要的是如何对这些行进行排序字母顺序的陈述。 我将尝试为该问题提供答案。

尽管您的请求非常普遍,但是令人遗憾的是,SQL没有将表(“角色”列)转换为逗号分隔的字符串的本地方法。 这通常不是问题,因为您可以简单地将Roles字段返回为

{
    UserName = u.UserName,
    RolesList = string.Join(", ", 
        u.UserRoles.Select(ur => ur.Role.RoleName).ToArray())
}

即使我刚刚提到没有与string.Join等效的函数,这也将令人惊讶地起作用。 这是因为LINQ足够聪明,可以让SQL返回表并在最后一分钟在内存中应用string.Join()。

当您随后尝试按RoleList字段排序时会出现问题,因为它是在内存中创建的,而不是在SQL中创建的。 如果这样做,您将收到以下错误消息。

NotSupportedException:方法'System.String Join(System.String,System.String [])'不支持对SQL的转换。

这给您两个选择:

  1. 为此编写一个存储过程,该过程利用自定义功能将表转换为逗号分隔的列表
  2. 或通过将其返回为.ToList()然后执行排序,将整个结果集带回内存,即(/ 我的整个查询 /).ToList().OrderBy(q => q.Roles);

如果您的数据集很大,第二个选择的速度会慢很多。 如果您的用户列表永远不会变得很大,或者仅当管理员加载用户管理屏幕时才会很少调用此查询,则内存选项可能不会明显变慢; 但是,如果将频繁调用此查询和/或用户表变大,则这可能不是一个可行的选择。

我建议第三个选择。 重新评估要求。 在这种情况下,用户可能确实需要过滤功能,以便他们可以查看处于a,b,c角色的所有用户。 如果这是真正的需求,则排序不仅难以实施,而且可能是更糟糕的解决方案。

祝好运!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM