2016-11-10 44 views
0

我用ObjectDataSource替换了一个SqlDataSource。这里的页面加载,我想行通过用户名进行分类,之后由所选择的列的我的选择方法EF:当我使用相同的签名定义委托时,OrderBy不起作用

Func<User, string> sortByDlg = (u) => 
{ 
    string sortStr = string.IsNullOrEmpty(sortColumn) ? "UserName" : sortColumn; 
    return sortStr; 
}; 

var users = db.Users.OrderBy(sortByDlg).ToList(); 

第一次的部分。

当我运行代码时,没有排序发生。它只有在我放回匿名方法时才起作用:OrderBy(u => u.UserName)

下面是完整的方法

public static List<UserViewModel> GetAllUserViewModels(string sortColumn) 
{ 
    using (var db = myDbContext.Create()) 
    { 
    var model = new List<UserViewModel>(); 
    Func<User, string> sortByDlg = (u) => 
    { 
     string sortStr = string.IsNullOrEmpty(sortColumn) ? "UserName" : sortColumn; 
      return sortStr; 
    }; 

    var users = db.Users.OrderBy(sortByDlg).ToList(); 
    foreach (var item in users) 
    { 
     var u = new UserViewModel 
     { 
      UserID = item.Id, 
      First_Name = item.FirstName, 
      Last_Name = item.LastName, 
      telephone = item.Telephone, 
      //more here ... 
     }; 

     model.Add(u); 
     } 
     return model; 
    } 
    } 

感谢您的帮助

+0

是。这是传递每个项目被返回。 – Richard77

+1

它是由常量“UserName”排序 - 对于每一行(不是列UserName中的值)。就像这样:'.OrderBy(u =>“UserName”)' –

+0

只需添加到@RobertMcKee的评论中,您的委托需要返回要排序的值而不是列的名称。您可以扩展此委托以使用反射返回指定属性的值。 – Rob

回答

1

这是我会怎么做,因为我觉得这样简单的理解(不使用表达式树):

public static List<UserViewModel> GetAllUserViewModels(string sortColumn) 
{ 
    using (var db = myDbContext.Create()) 
    { 
    var query = db.Users.AsQueryable(); 
    switch(string.IsNullOrEmpty(sortColumn) ? "UserName" : sortColumn) 
    { 
     case "UserName": query=query.OrderBy(u=>u.UserName); break; 
     case "FirstName": query=query.OrderBy(u=>u.FirstName); break; 
     ... more ... 
    } 
    var model = query.Select(u=> new UserViewModel { 
      UserID = item.Id, 
      First_Name = item.FirstName, 
      Last_Name = item.LastName, 
      telephone = item.Telephone, 
      //more here ... 
     }).ToList(); 
    return model; 
    } 
} 

实际上,我会为GetAllUsers创建函数,它返回IQueryable<User>,单独的扩展方法IQueryable<User> OrderByColumn(this IQueryable<User> u,string sortColumn),以及另一个扩展IEnumerable<UserViewModelItem> ToViewModel(this IQueryable<User> u),并使用它们,如:var result = GetAllUsers().OrderByColumn("UserName").ToViewModel();

// db defined elsewhere (repository pattern?)  
public IQueryable<User> GetAllUsers() 
{ 
    return db.Users.AsQueryable(); 
} 

public static IQueryable<User> OrderByColumn(this IQueryable<User> u,string sortColumn) 
{ 
    switch(string.IsNullOrEmpty(sortColumn) ? "UserName" : sortColumn) 
    { 
     case "UserName": return u.OrderBy(u=>u.UserName); break; 
     case "FirstName": return u.OrderBy(u=>u.FirstName); break; 
     ... more ... 
    } 
} 

public static IEnumerable<UserViewModelItem> ToViewModel(this IQueryable<User> users) 
{ 
    return users.Select(u=> new UserViewModelItem { 
      UserID = item.Id, 
      First_Name = item.FirstName, 
      Last_Name = item.LastName, 
      telephone = item.Telephone, 
      //more here ... 
     }).ToList(); 
}