我在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有一个到Address表的外键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 to Entities:
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;
}
}
或使用Entity 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中运行此排序操作的方法。有人知道我在这里做错了吗?
提前谢谢!
答案 0 :(得分:1)
我自己找到了解决方案。这是三个缺少字符的问题:在我上面的代码中,这...
<asp:LinkButton runat="server" ID="SortButtonName" Text="Name"
CommandName="Sort" CommandArgument="Address.Name1" />
... 错误,必须替换为:
<asp:LinkButton runat="server" ID="SortButtonName" Text="Name"
CommandName="Sort" CommandArgument="it.Address.Name1" />
与平面字段相比,使用“it。”表示相关对象的属性似乎必要。因此,在上面的第二个例子中,两种方式都是可能的:
CommandArgument="it.OrderCode" // works
CommandArgument="OrderCode" // works as well
相关对象的“对象标识”(主键字段)相同:
CommandArgument="it.Address.AddressID" // works
CommandArgument="Address.AddressID" // works as well
但同样对于不是身份的相关属性:
CommandArgument="it.Address.Name1" // works
CommandArgument="Address.Name1" // does NOT work
疯狂,我能找到(意外)这个解决方案的唯一地方就是这个视频:
How Do I Use the Entity Data Source?
...特别是在视频的9:40左右。
答案 1 :(得分:0)
关联类可能不会使用CommandArguments或DropDownList的DataTextField值。您可以使用数据传输对象进行列表和排序
public class OrderDTO
{
public string AddressName1 {get;set;}
}
using (EntitiesContext ctx = new EntitiesContext())
{
var result = from order in ctx.SOrder
let dto = new OrderDTO
{
AddressName1 = order.Address.Name1
//bla bla
};
orderby dto.AddressName1
select dto;
}