我有一个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可以使用我将在实体上调用派生属性.我没有测试过这个.