'Only primitive types, enumeration types and entity types are supported' 再一次

'Only primitive types, enumeration types and entity types are supported' again

我想,我理解它并且不会有问题。但现在我很困惑。我有以下代码:

public class ProjectMemberUserRolesElementViewModel
{
    public string AccessType { get; set; }
    public bool Delete { get; set; }
    public bool Create { get; set; }
    public bool Edit { get; set; }
    public bool Read { get; set; }
}


var elements = from i in db.ProjectAccessTypes
               select new ProjectMemberUserRolesElementViewModel()
               {
                   AccessType = i.Type,
                   Create = (i.ProjectMemberAccess.Where(p => p.ProjectMemberID == ProjectMemberID) != null) ? (from p in i.ProjectMemberAccess where p.ProjectMemberID == ProjectMemberID select p.Create).FirstOrDefault() : false,
                   Delete = (i.ProjectMemberAccess.Where(p => p.ProjectMemberID == ProjectMemberID) != null) ? i.ProjectMemberAccess.Where(p => p.ProjectMemberID == ProjectMemberID).Select(p => p.Delete).FirstOrDefault() : false,
                   Edit = (i.ProjectMemberAccess.Where(p => p.ProjectMemberID == ProjectMemberID) != null) ? i.ProjectMemberAccess.Where(p => p.ProjectMemberID == ProjectMemberID).Select(p => p.Edit).FirstOrDefault() : false,
                   Read = (i.ProjectMemberAccess.Where(p => p.ProjectMemberID == ProjectMemberID) != null) ? i.ProjectMemberAccess.Where(p => p.ProjectMemberID == ProjectMemberID).Select(p => p.Read).FirstOrDefault() : false
                };

为什么会出现这个错误?这里哪里不是原始类型?

非原始类型是您的类型 ProjectMemberUserRolesElementViewModel。我假设这种类型不是您的 EF 模型的一部分,而是您的视图模型的一部分 类。因此 EF 无法在 SQL.

的编译中投射到此类型

解决方案:改为投影到匿名类型,使用 .AsEnumerable() 方法 'go to in-memory mode',然后投影到您的视图模型类型。

解决方法很简单:

    elements = from i in db.ProjectAccessTypes
                select new ProjectMemberUserRolesElementViewModel()
                {
                    AccessType = i.Type,
                    Create = i.ProjectMemberAccess.Where(p => p.ProjectMemberID == ProjectMemberID).Select(p => p.Create).FirstOrDefault(),
                    Delete = i.ProjectMemberAccess.Where(p => p.ProjectMemberID == ProjectMemberID).Select(p => p.Delete).FirstOrDefault(),
                    Edit = i.ProjectMemberAccess.Where(p => p.ProjectMemberID == ProjectMemberID).Select(p => p.Edit).FirstOrDefault(),
                    Read = i.ProjectMemberAccess.Where(p => p.ProjectMemberID == ProjectMemberID).Select(p => p.Read).FirstOrDefault()
                };