2014-02-26 76 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

相关问题