2015-04-26 4 views
0

Я думал, что я это понимаю и не буду иметь проблем с ним. Но теперь я смущен. У меня есть следующий код:«Только поддерживаются примитивные типы, типы перечислений и типы объектов»

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

Почему я получаю эту ошибку? Где здесь нет примитивного типа?

+1

Вы можете заменить 'х? x: false' с 'x ?? false' – SLaks

+0

Ошибка Оператор '??' не может применяться к операндам типа «bool» и «bool» \t;) –

+1

Вставить 'p.Delete' в' bool? '. Однако значение по умолчанию 'bool' равно' false', поэтому вам это совсем не нужно. – SLaks

ответ

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

Не примитивный тип - это ваш тип ProjectMemberUserRolesElementViewModel. Я предполагаю, что этот тип не является частью вашей модели EF, а является частью ваших классов модели представлений. Поэтому EF не может проектировать этот тип в компиляции SQL.

Решение: используйте анонимный тип, используйте метод .AsEnumerable(), чтобы перейти в режим «в памяти», а затем проецировать на ваш тип модели просмотра.

+0

'AsEnumerable()' будет разбивать подзапросы. – SLaks

+0

то почему код (из i в db.ProjectAccessTypes выбрать новый ProjectMemberUserRolesElementViewModel() { AccessType = i.Type }). ToList(); работает отлично? –

Смежные вопросы

 Смежные вопросы