我的数据库中有IQueryable<Model>
个对象。我需要将它们转换为IQueryable<ViewModel>
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()但它也不会工作。
结果字符串应该用于示例:“Cecelia Leblanc,Sarah Hodge”......等等。
感谢您的任何意见。
答案 0 :(得分: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();
并从UserNamesString
访问models.AsQueryable()
媒体资源。