我正在使用Linq来实体我有以下查询
IQueryable<DomainModel.User> userResult =
userResult.OrderBy(u => u.UserClientRoles.OrderBy(r => r.Role.RoleName));
但我得到了
DbSortClause表达式必须具有可比较的类型
参数名称:密钥
错误,它返回0 colletction。
关于此的任何想法。
答案 0 :(得分:22)
.OrderBy()在处理数据库时,应该接受一个委托,该委托只返回表示数据库中一列的单个属性。我不确定你要做什么,但它看起来像
u.UserClientRoles.OrderBy(r => r.Role.RoleName)
将返回无法排序的值的枚举。
答案 1 :(得分:9)
我遇到了同样的问题,我用这个解决了它:
您的代码:
IQueryable<DomainModel.User> userResult = userResult.OrderBy(u => u.UserClientRoles.OrderBy(r => r.Role.RoleName));
我的代码:
List<Membership> results = new List<Membership>();
results.AddRange(memberships.OrderBy(m => m.Roles));
memberships = results.AsQueryable();
巧合:
*.OrderBy(m => m.Roles)
解决方案:
*.OrderBy(m => m.Roles.Select(r => r.RoleId).FirstOrDefault())
可能出现问题的原因:
也许,你做了我做的事情,并导致1个用户/成员在同一成员资格中拥有多个角色。这与OrderBy()发生冲突,因为应用程序只能&#34; order&#34;当她调用角色(这是元素的ICollection)时,它会收到多个没有优先级的元素(即使我们可以假设应用程序将扮演角色& #39;索引作为优先级的基础级别,实际上是它的基础级别。
解决方案的解释:
添加*.Select(r => r.RoleId)
时,您要指定应用程序将哪个元素用于OrderBy()。但是,正如您将在此时看到的那样,仅仅通过使用*.Select(r => r.RoleId)
可能是不够的,因为应用程序仍在接收具有相同优先级的多个结果。添加*.Select(r => r.RoleId).FirstOrDefault()
你基本上是这样说的:&#34; ...我不关心你从该元素收到多少结果,只关注第一个结果,或者按默认顺序排序。 &#34; (默认通常表示EMPTY或NULL)。
其他信息:
我使用非官方的简单概念/含义来解释一个简单单词的复杂解决方案,这意味着您可能有问题通过使用此中使用的单词/概念在网络中找到类似的帖子#34;答案&#34 ;.否则,代码本身就可以工作,你不应该通过自己应用和/或修改代码来解决问题。祝好运!!! (^ _ ^)
答案 2 :(得分:3)
在我的情况下,我不小心试图通过一个对象来订购,而不是通过其中一个属性进行排序。
你应该使用
var query = from Foo in Bar
orderby Foo.PropertyName
select Foo;
而不是
var query = from Foo in Bar
orderby Foo
select Foo;
注意:如果在 Foo ToString()方法上有覆盖,您将获得相同的行为事件。