我在 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 中工作。有人知道我在这里做错了什么吗?
先感谢您!