[英]Linq Sort Nested Table
后续问题:
说我有以下数据库表:
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的转换。
这给您两个选择:
如果您的数据集很大,第二个选择的速度会慢很多。 如果您的用户列表永远不会变得很大,或者仅当管理员加载用户管理屏幕时才会很少调用此查询,则内存选项可能不会明显变慢; 但是,如果将频繁调用此查询和/或用户表变大,则这可能不是一个可行的选择。
我建议第三个选择。 重新评估要求。 在这种情况下,用户可能确实需要过滤功能,以便他们可以查看处于a,b,c角色的所有用户。 如果这是真正的需求,则排序不仅难以实施,而且可能是更糟糕的解决方案。
祝好运!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.