在Entity Framework导航属性中的项目计数上对绑定的ASP.NET GridView进行排序

我有一个ASP.NET页面,其GridView控件绑定到EntityDataSource(请参阅下面的简化代码).网格显示父项列表,并包含一列以显示此父项的子项.Count.我可以让网格正确地显示计数,但我无法弄清楚asp:TemplateField的SortExpression值可以将排序设置为子计数.

这是我的代码看起来像(为简洁起见,简化)…

<asp:EntityDataSource ID="edsParentList" runat="server" 
     ConnectionString="name=FooEntities" 
     DefaultContainerName="FooEntities" 
     EnableFlattening="False" 
     EntitySetName="Parents" 
     EntityTypeFilter="Parent"
     Include="Children"
     OrderBy="it.Name"
     Where="(it.Name LIKE '%' + @ParentNameLike + '%')
     >
     <WhereParameters>
         <asp:Parameter Name="ParentNameLike" Type="String" DefaultValue="_" />
     </WhereParameters>
 </asp:EntityDataSource>
 <asp:GridView ID="grdParents" runat="server" 
     AllowPaging="True" 
     AllowSorting="True" 
     AutoGenerateColumns="False" 
     DataSourceID="edsParentList"
     PageSize="20" 
     onpageindexchanged="grdParents_PageIndexChanged" onsorted="grdParents_Sorted" >
     <Columns>
         <asp:TemplateField HeaderText="Name" SortExpression="Name">
             <ItemTemplate>
                 <a href="Parent.aspx?id=<%# Eval("ParentID") %>"><%# Eval("Name") %></a>
             </ItemTemplate>
         </asp:TemplateField>
         <asp:BoundField DataField="BirthDate" HeaderText="Birth Date" 
              DataFormatString="{0:yyyy-MM-dd HH:mm}"
              SortExpression = "BirthDate" />
         <asp:TemplateField HeaderText="Children" SortExpression="Children.Count">
             <ItemTemplate>
                 <asp:Label ID="lblChildCount" runat="server" 
                  Text='<%# Eval("Children.Count") %>'></asp:Label>
             </ItemTemplate>
         </asp:TemplateField>
     </Columns>
 </asp:GridView>

这显示网格很好.但是,当我单击Children列的标题时,会抛出此错误:

‘Count’ is not a member of
‘Transient.collection[FooEntities.Child(Nullable=True,DefaultValue=)]’.
To extract a property of a collection element, use a subquery to
iterate over the collection.

我的问题是:如何在由一组子对象组成的导航属性的.Count()上启用排序?

有没有办法用SortExpression指定这个,还是我必须分解并手动完成所有的分页和排序? (我显然更愿意避免!)

最佳答案 在你的位置,由于实体类被声明为partial,我会尝试为Parent实体创建一个补充的部分类代码文件,并添加一个ChildCount只读属性.此属性将引用Children导航属性.然后我会对此进行评论.

我假设,在这里,EntityDataSource可以使用我将在实体上调用派生属性.我没有测试过这个.

点赞