2013-02-15 67 views
0

我的數據庫中有一個IQueryable<Model>對象。我需要將它們轉換爲IQueryable<ViewModel>如何使用Linq 2實體聚合字符串

class Model 
{ 
    public Guid ModelId { get; set; } 

    // some properties 

    public virtual User Users{ get; set; } 

} 

class User 
{ 
    public Guid UserId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

class ViewModel 
{ 
    public Guid ModelId { get; set } 
    public string UsersName { get; set; } 
} 

ViewModel.UsersName應合併首先用戶名和姓的字符串。 這個需要是IQueryable,因爲我將使用DevExpress Mvc Grid,我需要以這種方式傳遞它。網格處理分頁,所以它需要IQueryable。

我已經試過:

IQueryable<ViewModel> viewModel = model.Select(s => new ViewModel() 
     { 

      UsersName = s.Users 
       .OrderBy(d => d.LastName) 
       .ThenBy(d => d.FirstName) 
       .Aggregate(string.Empty, (s1, users) => users.FirstName + ' ' + users.Surname + ", ") 
     }); 

,但它不是平移,以LINQ到實體。我也試過string.join(),但它也不會工作。

結果字符串應該是expample:「西西莉婭勒布朗,莎拉·霍奇」 ......等

感謝任何輸入。

+0

你需要什麼'UsersName'?也許在DevExpress網格上這會更容易一些(因爲它必須在某個時間點對數據進行素材處理) – 2013-02-15 12:07:02

+0

UsersName將作爲一列顯示在網格上。感謝您的建議。 – 2013-02-15 12:28:45

回答

2

通常查看模型/ DTO不應該太聰明,但是這種情況下,一點智能性對於舒適來說太方便了。創建一個視圖模型,如:

class ViewModel 
{ 
    public Guid ModelId { get; set; } 
    public IEnumerable<string> UserNames { get; set; } 
    public string UserNamesString 
    { 
     get { return string.Join(", ", this.UserNames); } 
    } 
} 

通過

var models = s.Models.Select(m => new ViewModel 
         { ModelId = m.ModelId, 
          UserNames = m.Users 
             .OrderBy(d => d.LastName) 
             .ThenBy(d => d.FirstName) 
             .Select(u => u.FirstName + ' ' 
                + u.Surname) 
         }).ToList(); 

填充它,然後從models.AsQueryable()訪問UserNamesString屬性。