Sorting Issue with User defined datatypes (Custom Properties) in C#

493 Views Asked by At

I have a grid where I am biding data from an object. Object has some complex data types. Below is my code Able to sort ORDERID and OrderNumber BUT NOT CustomerInfo Property

Class :

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

My Front End grid has columns defined one of the columns is

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

When I am passing Sort Expression : OrderCustomerInfo.LastName it's not recognizing the column below is my sort function, I am getting error --

Instance property 'OrderCustomerInfo.LastName' is not defined for type 'Order' Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.ArgumentException: Instance property 'OrderCustomerInfo.LastName' is not defined for type 'Order' )

Error Line -- Expression property = 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

There are 2 best solutions below

3
On

Is the issue not that this line:

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

Is missing a .?

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

The exception states that:

Exception Details: System.ArgumentException: Instance property 'OrderCustomerInfo.LastName' is not defined for type 'Order' )

So I'd reckon you need to update your SortExpression and Eval as:

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