2016-11-10 15 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(); 
} 
相關問題