使用C#中的用户定义数据类型(自定义属性)排序问题

时间:2014-06-10 15:45:24

标签: c# linq object gridview-sorting columnsorting

我有一个网格,我正在从一个对象中获取数据。对象有一些复杂的数据类型。下面是我的代码能够排序ORDERID和OrderNumber但不是CustomerInfo属性

班级:

public class Order
{    
    public Int32 OrderID{ get; set; }
    public String OrderNumber { get; set; }        
    public Customer CustomerInfo { get; set;}
}

public class Customer
{
    public Int64 CustomerNumber { get; set; }
    public String FirstName { get; set; }
    public String  LastName { get; set; }
    public String Phone { get; set; }
}

我的前端网格已定义列,其中一列是

<asp:TemplateField HeaderText="Last Name"  ItemStyle-Width="15%" SortExpression="OrderCustomerInfo.LastName">
    <ItemTemplate>
        <%# Eval("OrderCustomerInfo.LastName") %>
    </ItemTemplate>
</asp:TemplateField>

当我传递排序表达式时:OrderCustomerInfo.LastName它不能识别下面的列是我的排序函数,我收到错误 -

Instance property&#39; OrderCustomerInfo.LastName&#39;未定义类型&#39;订单&#39;   描述:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

  

异常详细信息:System.ArgumentException:Instance属性   &#39; OrderCustomerInfo.LastName&#39;未定义类型&#39;订单&#39; )

错误行 - 表达式属性= Expression.Property(param,columnName); // x.ColumnName

public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> collection, string columnName, SortDirection direction)
{
    ParameterExpression param = Expression.Parameter(typeof(T), "x"); // x
    Expression property = Expression.Property(param, columnName);     // x.ColumnName
    Func<T, object> func = Expression.Lambda<Func<T, object>>(        // x => x.ColumnName
    Expression.Convert(Expression.Property(param, columnName),
    typeof(object)), param).Compile();

    Func<IEnumerable<T>, Func<T, object>, IEnumerable<T>> expression =
        SortExpressionBuilder<T>.CreateExpression(direction);
    IEnumerable<T> sorted = expression(collection, func);

    return sorted;
}

2 个答案:

答案 0 :(得分:0)

问题不在于这一行:

<%# Eval("OrderCustomerInfo.LastName") %>

缺少一个。?

<%# Eval("Order.CustomerInfo.LastName") %>

答案 1 :(得分:0)

该例外说明:

  

异常详细信息:System.ArgumentException:Instance属性   &#39; OrderCustomerInfo.LastName&#39;未定义类型&#39;订单&#39; )

因此,我认为您需要将SortExpressionEval更新为:

<asp:TemplateField HeaderText="Last Name"  ItemStyle-Width="15%" SortExpression="CustomerInfo.LastName">
    <ItemTemplate>
        <%# Eval("CustomerInfo.LastName") %>
    </ItemTemplate>
</asp:TemplateField>