对绑定到EntityDataSource的asp:ListView进行排序

时间:2010-02-20 20:59:28

标签: asp.net entity-framework sorting listview entitydatasource

我在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中运行此排序操作的方法。有人知道我在这里做错了吗?

提前谢谢!

2 个答案:

答案 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;
}