C# 不允许在查询中构造实体类型
知道我做错了什么吗。我试图通过链接两个表来返回AppRole类型的对象。但我得到的错误是,不允许在查询中显式构造实体类型“AppRole”。如何获取满足条件的AppRole类型的对象C# 不允许在查询中构造实体类型,c#,sql,linq,linq-to-sql,C#,Sql,Linq,Linq To Sql,知道我做错了什么吗。我试图通过链接两个表来返回AppRole类型的对象。但我得到的错误是,不允许在查询中显式构造实体类型“AppRole”。如何获取满足条件的AppRole类型的对象 AppRole RoleName = (from role in dbContext.AppRoles join user in dbContext.AppUsers on role.RoleID equals user.Rol
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();
您不能直接创建该对象,因为您刚刚学到了硬道理。当您调用
selectnewapprole{}
时,您正在显式地创建一个新的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到sql查询时(linq到实体也是如此),它会将代码转换为sql,但是对象创建无法转换为sql,因此您会收到一条错误消息,就像您刚刚经历的一样。您只需要执行
选择角色即可。FirstOrDefault()
msdn说:@Grundy你完全正确,刚刚更新了我的答案。我已经有一段时间没有使用这种方式进行查询了。我通常使用lambda风格。刚刚更新了我的答案。谢谢JNYRanger…它成功了。