2011-03-26 104 views
3

我需要用ValueInjecter將IQueryable<User>映射到IQueryable<SimpleUser>IQueryable的ValueInjecter <T>

這可能嗎?

我想:

return userRepo.GetUsers() 
       .Select(o => new SimpleUser().InjectFrom(o)) 
       .Cast<SimpleUser>(); 

但是,這不能被轉換爲存儲表達式...好,方法InjectFrom

automapper可以做到這一點嗎?

我想類似這樣的東西:

return from i in userRepo.GetUsers() 
     select new SimpleUser{ 
      i.UserId, 
      i.Name 
     }; 

但利用某種映射工具。

回答

4

在進行選擇之前將集合轉換爲對象,它應該可以工作。 更新使用PredicateBuilder來顯示過濾和分頁和Dynamic LINQ進行排序。

var predicate = new PredicateBuilder<User>.True(); 
if (!string.IsNullOrEmpty(typeFilter)) 
{ 
    predicate = predicate.And(u => u.Type == typeFilter); 
} 
if (!string.IsNullOrEmpty(nameFilter)) 
{ 
    predicate = predicate.And(u => u.Name.StartsWith(nameFilter)); 
} 

// assumes sortColumn matches one of your user properties and 
// sortDirection is either "ASC" or "DESC" 
string sortOrder = string.Format("{0} {1}", sortColumn, sortDirection); 

return userRepo.GetUsers() 
       .Where(predicate) 
       .OrderBy(sortOrder) 
       .Skip((page-1) * usersPerPage) 
       .Take(usersPerPage) 
       .ToList() // force the query and make these objects 
       .Select(o => new SimpleUser().InjectFrom(o)) 
       .Cast<SimpleUser>(); 
+0

有沒有辦法在評估查詢之前做到這一點?我有一個網格控件,利用IQueryable進行過濾,分頁和排序。 – 2011-03-26 17:03:57

+0

@Lol編碼器 - 在嘗試進行轉換之前,您需要進行過濾,排序和分頁。簡單而簡單,轉換不會轉換爲SQL,因此您必須將LINQ用於對象,這意味着所有對象都必須位於內存中。是否可以映射對應於SimpleUser的視圖?然後你可以設置SQL函數對應的視圖,允許你傳入參數做過濾,排序,分頁。 – tvanfosson 2011-03-26 17:07:50

+0

@tvanfosson我編輯了我的問題以顯示我想實現的目標。 – 2011-03-26 19:45:43