如何使用Linq 2实体聚合字符串

时间:2013-02-15 11:41:50

标签: asp.net-mvc-3 linq-to-entities devexpress

我的数据库中有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”......等等。

感谢您的任何意见。

1 个答案:

答案 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()媒体资源。