Asp.net 具有EntityDataSource OrderBy属性的OrderBy子实体

Asp.net 具有EntityDataSource OrderBy属性的OrderBy子实体,asp.net,linq-to-sql,entity-framework-4,Asp.net,Linq To Sql,Entity Framework 4,我有一个EntityDataSource,它将选择所有用户实体,这些用户实体具有roleID排序的特定角色。我想显示按角色划分的用户,因此订单部分很重要 以下代码: <asp:EntityDataSource ID="UserDataSource" runat="server" ConnectionString="name=MyEntities" DefaultContainerName="MyEntities" EnableFlattening="False" Enti

我有一个EntityDataSource,它将选择所有用户实体,这些用户实体具有roleID排序的特定角色。我想显示按角色划分的用户,因此订单部分很重要

以下代码:

<asp:EntityDataSource ID="UserDataSource" runat="server" ConnectionString="name=MyEntities" 
    DefaultContainerName="MyEntities" EnableFlattening="False"
    EntitySetName="Users" Where="EXISTS(SELECT VALUE u FROM it.UserRoles AS u)" OrderBy="it.UserRoles.RoleId">
</asp:EntityDataSource>
产生以下错误:

“RoleId”不是“Transient.collection[MyModel.UserRoleNullable=True,DefaultValue=]”的成员。要提取集合元素的属性,请使用子查询对集合进行迭代

添加Include=UserRoles没有帮助


问题是单个用户可能有多个UserRole。因此,您不能使用角色id对用户集进行排序-没有与给定用户关联的单个角色id。这是一条错误消息,上面说-it.UserRoles是一个集合,没有角色id属性。该属性存在于集合的元素UserRole上


考虑到用户可以有多个角色,我不确定您的排序逻辑,但假设用户可以有一个且只有一个角色,您可以使用诸如it.UserRoles.First.RoleId之类的表达式来获得您的排序。更好的方法是编辑模型,以显示用户角色关系的正确多重性。

确定。我找到了正确的语法。这是:


OrderBy=anyelement从it.UserRoles中选择值SqlServer.MINr.RoleId作为r

谢谢。我自己发现的。。。我只是在写答案,但你在这方面打败了我……这个想法是正确的,但是it.UserRoles.First导致了以下错误:“First”不是“Transient.collection[MyModel.UserRoleNullable=True,DefaultValue=]”的成员。要提取集合元素的属性,请使用子查询对集合进行迭代