【发布时间】:2010-02-20 20:59:27
【问题描述】:
我在 ASP.NET 页面上有一个 asp:ListView 控件。它绑定到以这种方式设置的 EntityDataSource:
<asp:EntityDataSource ID="EntityDataSourceOrders" runat="server"
ConnectionString="name=EntitiesContext"
DefaultContainerName="EntitiesContext" EntitySetName="SOrder"
Include="Address"
EnableDelete="True" EnableInsert="True"
EnableUpdate="True">
</asp:EntityDataSource>
在 SQL Server 中有两个表,SOrder 和 Address。 SOrder 有一个外键 AddressID 到地址表(“一个订单有一个地址”)。该地址有一个字母数字字段“Name1”。
在ListView的LayoutTemplate中有一个链接按钮,用于按照订单地址的Name1对列表中的订单进行排序:
<asp:LinkButton runat="server" ID="SortButtonName" Text="Name"
CommandName="Sort" CommandArgument="Address.Name1" />
如果我单击此按钮,我会收到一个 EntitySqlException,告诉我“'Address.Name1' 无法在当前上下文中解析”。
按订单表的“平面”字段排序 - 例如“OrderCode” - 有效:
<asp:LinkButton runat="server" ID="SortButtonOrderCode" Text="Order number"
CommandName="Sort" CommandArgument="OrderCode" />
所以只有当我尝试按另一个表中的相关字段排序时才会发生异常。我期望使用 EntityDataSource 的 Include="Address" 属性按相关地址的字段排序应该是可能的,但似乎不是。
我做了一个测试来检查我希望 EntityDataSource 在内部创建的查询:
使用 Linq 到实体:
using (EntitiesContext ctx = new EntitiesContext())
{
var result = from order in ctx.SOrder.Include("Address")
orderby order.Address.Name1
select order;
foreach (SOrder x in result)
{
string test=x.Address.Name1;
}
}
或者使用实体 SQL:
string queryString = @"SELECT VALUE x FROM SOrder AS x
Order By x.Address.Name1";
using (EntitiesContext ctx = new EntitiesContext())
{
ObjectQuery<SOrder> query =
new ObjectQuery<SOrder>(queryString, ctx).Include("Address");
foreach (SOrder x in query.Execute(MergeOption.AppendOnly))
{
string test=x.Address.Name1;
}
}
两者都有效!我得到一个排序的结果。
现在我有点迷失了如何在 ListView 中进行这种排序操作。有人知道我在这里做错了什么吗?
提前谢谢你!
【问题讨论】:
标签: asp.net entity-framework sorting listview entitydatasource