Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将linq查询联接到viewmodel的结果_C#_Asp.net Mvc_Entity Framework_Linq_List - Fatal编程技术网

C# 将linq查询联接到viewmodel的结果

C# 将linq查询联接到viewmodel的结果,c#,asp.net-mvc,entity-framework,linq,list,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.Work

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

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();
我有一个相同格式的VIE模型,如下所示:

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));
但不幸的是,这并不是RoleViewModel的列表。以下是调试器中值部分的副本:

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

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

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();
List List=db.WorkRoles。
加入(db.WorkRoleUsersDetails,
o=>o.WorkRoleId,od=>od.WorkRoleId,
(o,od)=>新
{
WorkRoleId=o.WorkRoleId,
RoleName=o.RoleName,
RoleDescription=o.RoleDescription,
CompanyId=o.CompanyId,
WRUDId=od.WRUDId,
UserDetailsId=od.UserDetailsId,
FocusStart=od.FocusStart,
FocusEnd=od.FocusEnd
}).可计算的()
.选择(项=>新角色视图模型(
item.WorkRoleId,
项目1.RoleName,
item.RoleDescription,
item.CompanyId,
item.WRUDId,
item.UserDetailsId,
item.FocusStart,
item.FocusEnd().ToList();

我能给你的最好建议是:避免使用
var
,并在可以使用的地方明确指定类型。如果你这样做,你的编译器会给你一个错误。

.ToList()
放在你的代码末尾。为什么不干脆
(o,od)=>新的RoleViewModel{..).ToList()谢谢,这起作用了。同时也感谢您的提示:)第一个
列表可以
可计算
,以防止生成无用的中间结果。@GertArnold:它实际上可以完全删除。我会编辑回复。但是EF会抱怨没有使用无参数构造函数。你必须将第二部分从作为表达式执行的部分中分离出来。是的,我忘了。我习惯于初始化,而不是构造函数。再次编辑:P。