'仅支持原始类型,枚举类型和实体类型'再次

时间:2015-04-26 19:43:13

标签: c# entity-framework linq-to-entities

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

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
                };

为什么我收到此错误?这里哪里不是原始类型?

2 个答案:

答案 0 :(得分:0)

非原始类型是您的类型ProjectMemberUserRolesElementViewModel。我假设这种类型不是你的EF模型的一部分,而是你的视图模型类的一部分。因此,在编译为SQL时,EF无法投射到此类型。

解决方案:改为投射到匿名类型,使用.AsEnumerable()方法进入内存模式',然后投影到您的视图模型类型。

答案 1 :(得分:0)

解决方案很简单:

    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()
                };