c# - 将 linq 查询连接到 View 模型的结果

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

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

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

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

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

最佳答案

您必须使用 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 并尽可能明确地指定类型。如果您这样做了,您的编译器就会报错。

关于c# - 将 linq 查询连接到 View 模型的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42001936/

相关文章:

c# - FlowLayoutPanel 自动调整大小

c# - 如何将视频的第一帧保存为图像?

c# - 选择 System.Drawing.Icon 的大小?

c# - DropDownList - 以编辑形式显示的选定值

asp.net-mvc - ASP.NET MVC - 如何在请求之间保存一些数据?

c# - 在生产源代码中将 Entity Framework 日志记录设置为调试窗口是否可以?

c# - 如何避免向由 Seed 方法引起的 EntityFramework 管理的数据库添加重复项?

c# - 无法加载文件或程序集 Microsoft.Extensions.DependencyInjection.Abstractions, Version=5.0.0.0

c# - 验证不同于页面 ViewModel 的 ViewModel

entity-framework - EF4 Context.ApplyCurrentValues 不更新当前值