2014-02-26 61 views
0

我想排序Users使用lambda表達式。我的用戶類無法將類型'System.String'強制類型爲'System.Object'

public class Users 
{ 
     public long Id { get; set; } 
     public string UserName { get; set; } 
     public string Password { get; set; } 
     public string FirstName { get; set; } 
     public string LastName { get; set; } 
     public DateTime DateCreated { get; set; } 
} 

和我的排序方法

public List<Users> SortUsers(string sSortBy) 
{ 
    var arg = Expression.Parameter(typeof(Users), "Users"); 
    var body = Expression.Convert(Expression.Property(arg, sSortBy), typeof(object)); 
    var lambda = Expression.Lambda<Func<Users, object>>(body, arg); 

    List<Users> UserList; 
    UserList = UOWUser.UsersRepository.Entities.OrderBy(lambda).ToList(); // Error here 
    return UserList; 
} 

我被

List<Users> UserList; 
UserList = objUsers.SortUsers("FirstName"); 

訪問方法,我路過sSortBystring(這裏的 「名字」)

錯誤:無法投射類型'System.String'來鍵入'System.Object'。

配管線UserList = UOWUser.UsersRepository.Entities.OrderBy(lambda).ToList();

EDIT

public List<Users> SortUsers(string sSortBy) 
{ 
    var arg = Expression.Parameter(typeof(Users), "Users"); 
    var TType = Expression.Property(arg, sSortBy).Type; 
    var body = Expression.Convert(Expression.Property(arg, sSortBy), TType); 
    var lambda = Expression.Lambda<Func<Users, object>>(body, arg);// Error here :: Expression of type 'System.DateTime' cannot be used for return type 'System.Object' 
    List<Users> UserList; 
    UserList = UOWUser.UsersRepository.Entities.OrderBy(lambda).ToList(); 
    return UserList; 
} 

正常工作與UserList = objUsers.SortUsers("FirstName");但給錯誤時,不能使用類型 '的System.DateTime' 的UserList = objUsers.SortUsers("DateCreated");

表達退貨類型爲 'System.Object的'

任何幫助,將不勝感激謝謝

+0

我認爲你需要在Convert方法中使用'typeof(string)'而不是'typeof(object)' –

+0

@ Selman22感謝您的反饋,但typeof(string)只能用於字符串屬性,如果我必須按Id排序然後它應該是typeof(int),所以我不能和需要一個通用的方法,應該爲字符串,整型,日期時間等工作,所以我用typeof(object) – pravprab

+0

hmm,然後得到你的屬性類型與反射,然後通過它?像:'typeof(Users).GetProperty(sSortBy).PropertyType' –

回答

1

檢查這一項:

public static List<Users> SortUsers(string sSortBy) 
{ 
    var arg = Expression.Parameter(typeof(Users), "Users"); 
    var sortProperty = Expression.Property(arg, sSortBy); 
    var lambda = Expression.Lambda(sortProperty, arg); 

    var param = Expression.Parameter(typeof(IQueryable<Users>)); 
    var orderByCall = Expression.Call(typeof(Queryable), "OrderBy", new Type[] { typeof(Users), sortProperty.Type }, new Expression[] { param, lambda }); 
    var orderLambda = Expression.Lambda<Func<IQueryable<Users>, IQueryable<Users>>>(orderByCall, param).Compile(); 

    List<Users> UserList; 
    UserList = orderLambda(UOWUser.UsersRepository.Entities).ToList(); // Error here 
    return UserList; 
} 

這使得整個source.OrderBy(x => x.PropName)通過Expression,所以你不必實際指定x.PropName類型。

+0

謝謝,這對我來說工作得很好......! – pravprab

相關問題