Структура сущностей, эквивалентная SQL 'IS NULL' - PullRequest
4 голосов
/ 19 августа 2011

Я пытаюсь перевести следующий запрос в структуру сущности:

SELECT            Subjects.Name
FROM              Subjects LEFT OUTER JOIN
                        Projects_Subjects ON Subjects.ID = Projects_Subjects.Section_ID
WHERE             (Projects_Subjects.Project_ID IS NULL) OR
                        (Projects_Subjects.Project_ID <> 2)

Где subject - это простая таблица с subject.ID, subject.Name и Projects_Subjects - это таблица, в которой отражаются отношения «многие ко многим» между субъектами и проектами со столбцами Projects_Subjects.Project_ID и Projects_Subjects.Subject_ID.

Этот запрос прекрасно работает в SQL, так как возвращает все темы, которые еще не связаны с проектом с ID = 2.

Я пытаюсь перевести это в Linq для Entities. Пока что у меня есть:

db.Subjects.Where(s => s.Projects == null || !s.Projects.Select(p => p.ID).Contains(ProjectID))

Что компилятору нравится синтаксис, но во время выполнения я получаю следующую ошибку:

'System.Data.Objects.DataClasses.EntityCollection`1'. Only primitive types (such as Int32, String, and Guid) and entity types are supported.

На самом деле другой информации нет. Насколько я могу судить, ему не нравится нулевой бит s.Projects ==, так как он прекрасно работает, если я его уберу. Вопрос: как я могу выполнить эту проверку для коллекции сущностей?

Ответы [ 3 ]

4 голосов
/ 19 августа 2011

Ответ в том, что я идиот.По умолчанию для запроса linq to entity он будет возвращать все, и вам просто нужно вычесть оттуда.Так просто

db.Subjects.Where(s => !s.Projects.Select(p => p.ID).Contains(ProjectID))

На самом деле делает то, что я хотел, чтобы ... Извините за трату времени.

1 голос
/ 19 августа 2011

Вы проверяете не для столбца, чтобы быть нулевым, но для связанного свойства (другой объект), чтобы быть нулевым. Как вы указали, это состояние по умолчанию.

Это исключение, которое вы получили, в основном означает, что только SQL-типы POCO могут быть отправлены в SQL для сравнения в выражениях where / order с типами SQL. EF думает, что вы пытаетесь сравнить объекты здесь, поэтому жалуется.

0 голосов
/ 19 августа 2011

Как то так?

var subjects = from subject in dc.GetTable<Subjects>()
                               join entityProjects_Subjects in dc.GetTable<Projects_Subjects>()
                                    on subject.ID equals entityProjects_Subjects.Section_ID into tempProjects_Subjects
                               from projects_subjects in tempProjects_Subjects.DefaultIfEmpty()
                               where projects_subjects.Project_ID != 2 || projects_subjects == null
                               select new
                               {                                   
                                   Name = subject.Name
                               };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...