C# 不允许在查询中构造实体类型

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类型的对象。但我得到的错误是,不允许在查询中显式构造实体类型“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();

您不能直接创建该对象,因为您刚刚学到了硬道理。当您调用
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…它成功了。