1

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

先感谢您!

4

2 回答 2

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" />

使用“它”。与平面字段相比,相关对象的属性似乎是必要的。因此,在上面的第二个示例中,两种方式都是可能的:

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

疯狂,我可以(意外)找到该解决方案的唯一指示的地方是这个视频:

如何使用实体数据源?

...尤其是在视频的 9:40 分钟左右。

于 2010-02-22T18:47:04.040 回答
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;
}
于 2010-02-20T22:32:25.757 回答