【问题标题】:Result of join linq query to a viewmodel将 linq 查询连接到视图模型的结果
【发布时间】:2017-02-02 12:11:37
【问题描述】:

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

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; }
}

将查询结果转换为视图模型列表的最佳方法是什么?

我从 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));

但是,遗憾的是,这让喵喵叫的不是RoleViewModels 的列表。这是调试器中值部分的副本:

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

【问题讨论】:

  • .ToList() 放在代码末尾。
  • 为什么不只是(o, od) =&gt; new RoleViewModel { ....}).ToList();

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


【解决方案1】:

您必须使用ToList 来获取您的项目列表。您将 query 分配给您的 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,并尽可能明确地指定类型。如果你这样做了,你的编译器就会给你一个错误。

【讨论】:

  • 谢谢,这成功了。也感谢您的提示:)
  • 并且第一个ToList可以是AsEnumerable,以防止构建无用的中间结果。
  • @GertArnold:它实际上可以完全删除。我会编辑回复。
  • 但是 EF 会抱怨没有使用无参数构造函数。您必须将第二部分与作为表达式执行的部分分离。
  • 是的,我忘记了。我习惯于初始化,而不是构造函数。再次编辑:P。
猜你喜欢
  • 1970-01-01
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多