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。