知道我可能做错了什么。我试图通过链接2个表来返回Type AppRole的对象。但我得到错误不允许在查询中明确构造实体类型'AppRole'。如何获得符合条件的AppRole类型的对象。
AppRole RoleName = (from role in dbContext.AppRoles
join user in dbContext.AppUsers on role.RoleID equals user.RoleID
where user.UserName.Contains(userNameDL)
select new AppRole
{
RoleID = role.RoleID,
RoleName = role.RoleName,
Description = role.Description,
Status = role.Status,
UpdateDate = role.UpdateDate
}).FirstOrDefault();
答案 0 :(得分:2)
当你刚学会硬道时,你无法直接创建该对象。当您调用select new AppRole{}
时,您明确地创建了一个新的,这是不必要的,因为您的查询中已经有一堆AppRole
个对象。你只想从集合中抽出一个。
相反,你可以这样做:
AppRole RoleName = (from role in dbContext.AppRoles
join user in dbContext.AppUsers on role.RoleID equals user.RoleID
where user.UserName.Contains(userNameDL)
select role)
.FirstOrDefault();
select new
或.Select()
(带有lambda)用于进行投影,通常为不同的数据类型。由于您在已创建的AppRole
对象上运行查询,因此不需要这样做,而是返回匹配的第一个。
至于为什么你不能这样做是因为当你执行linq-to-sql查询时(在linq-to-entities中也是这种情况),它会将代码转换为SQL,但是,对象创建无法转换为SQL,因此您将收到一条错误信息,就像您刚刚经历过的那样。