将linq查询连接到视图模型的结果

时间:2017-02-02 12:11:37

标签: c# asp.net-mvc entity-framework linq list

在我的操作方法中,我运行以下查询,该查询返回一个列表:

var list = db.WorkRoles.
                Join(db.WorkRolesUsersDetails,
                o => o.WorkRoleId, od => od.WorkRoleId,
                (o, od) => new
                {
                    WorkRoleId = o.WorkRoleId,
                    RoleName = o.RoleName,
                    RoleDescription = o.RoleDescription,
                    CompanyId = o.CompanyId,
                    WRUDId = od.WRUDId,
                    UserDetailsId = od.UserDetailsId,
                    FocusStart = od.FocusStart,
                    FocusEnd = od.FocusEnd
                }).ToList();

我有一个相同格式的viemodel,如下所示:

public class RoleViewModel
{
    public RoleViewModel(int workRoleId, string roleName, string roleDescription, int companyId, int wRUDId, string userDetailsId, DateTime focusStart, DateTime focusEnd)
    {
        WorkRoleId = workRoleId;
        RoleName = roleName;
        RoleDescription = roleDescription;
        CompanyId = companyId;
        WRUDId = wRUDId;
        UserDetailsId = userDetailsId;
        FocusStart = focusStart;
        FocusEnd = focusEnd;
    }
    int WorkRoleId { get; set; }
    string RoleName  { get; set; }
    string RoleDescription { get; set; }
    int CompanyId { get; set; }
    int WRUDId { get; set; }
    string UserDetailsId { get; set; }
    DateTime FocusStart { get; set; }
    DateTime FocusEnd { get; set; }
}

将查询结果转换为viewmodel列表的最佳方法是什么?

我在stackoverflow上的答案中尝试过的一件事是:

var list = db.WorkRoles.
                Join(db.WorkRolesUsersDetails,
                o => o.WorkRoleId, od => od.WorkRoleId,
                (o, od) => new
                {
                    WorkRoleId = o.WorkRoleId,
                    RoleName = o.RoleName,
                    RoleDescription = o.RoleDescription,
                    CompanyId = o.CompanyId,
                    WRUDId = od.WRUDId,
                    UserDetailsId = od.UserDetailsId,
                    FocusStart = od.FocusStart,
                    FocusEnd = od.FocusEnd
                }).ToList()
                .Select(item => new RoleViewModel(
                   item.WorkRoleId,
                    item.RoleName,
                    item.RoleDescription,
                    item.CompanyId,
                    item.WRUDId,
                    item.UserDetailsId,
                    item.FocusStart,
                    item.FocusEnd));

但是,遗憾的是,这得到的不是列表og RoleViewModel。这是调试器中值部分的副本:

{System.Linq.Enumerable.WhereSelectListIterator<<>f__AnonymousType6<int, string, string, int, int, string, System.DateTime, System.DateTime>, eksp.Models.RoleViewModel>}

1 个答案:

答案 0 :(得分:3)

您必须使用ToList来获取商品列表。您正在将查询分配给list变量。查询是延迟的,这意味着在您通过调用ToListToArrayFirst等实际检索结果之前,它不会被执行:

List<RoleViewModel> list = db.WorkRoles.
                Join(db.WorkRolesUsersDetails,
                o => o.WorkRoleId, od => od.WorkRoleId,
                (o, od) => new
                {
                    WorkRoleId = o.WorkRoleId,
                    RoleName = o.RoleName,
                    RoleDescription = o.RoleDescription,
                    CompanyId = o.CompanyId,
                    WRUDId = od.WRUDId,
                    UserDetailsId = od.UserDetailsId,
                    FocusStart = od.FocusStart,
                    FocusEnd = od.FocusEnd
                }).ToEnumerable()
                .Select(item => new RoleViewModel(
                   item.WorkRoleId,
                    item.RoleName,
                    item.RoleDescription,
                    item.CompanyId,
                    item.WRUDId,
                    item.UserDetailsId,
                    item.FocusStart,
                    item.FocusEnd)).ToList();

我可以给你的最佳提示:避免使用var并明确指定类型。如果您这样做,您的编译器会给您一个错误。