Вопрос

Итак, моя ситуация такова, что у меня есть модель linq-to-sql, которая не позволяет датам иметь значение null в одной из моих таблиц.Это так и есть, поскольку база данных не допускает пустых значений в этом поле.Моя проблема в том, что когда я пытаюсь написать запрос Linq с этой моделью, я больше не могу выполнять левое соединение с этой таблицей, потому что дата не является полем, допускающим значение NULL, и поэтому я не могу сравнить ее с «Ничего».

Пример:Существует таблица фильмов {ID,MovieTitle} и таблица показов {ID,MovieID,ShowingTime,Location}.

Сейчас я пытаюсь написать заявление, которое вернет все те фильмы, у которых нет показов.В T.SQL это будет выглядеть так:

Select m.*
From Movies m Left Join Showings s On m.ID = s.MovieID
Where s.ShowingTime is Null

Теперь, в этой ситуации, я мог бы проверить значение Null в поле «Местоположение», но это не то, что у меня есть на самом деле (просто упрощенный пример).Все, что у меня есть, это ненулевые даты.

Я пытаюсь написать в Linq:

From m In dbContext.Movies _
Group Join s In Showings on m.ID Equals s.MovieID into MovieShowings = Group _
From ms In MovieShowings.DefaultIfEmpty _
Where ms.ShowingTime is Nothing _
Select ms

Однако я получаю сообщение об ошибке

Оператор Is не принимает операнды типа Дата.Операнды должны быть ссылочными или допускающими значение NULL типами.

Есть ли способ обойти это?Модель правильная, в таблице Showings:ShowTime никогда не должно быть нуля.Но если вы выполняете левое соединение и нет времени показа для определенного фильма, тогда ShowTime ДОЛЖНО быть пустым для этого фильма...

Спасибо всем за вашу помощь.

Это было полезно?

Решение

Использование левого соединения здесь вам не поможет.Поскольку в правой таблице никогда не может быть никаких результатов, вы можете просто получить левую таблицу и только левую.Это простой запрос «нет в»/«не существует»:

From m in dbContext.Movies _
Where Not dbContext.Showings.Any(Function(s) s.MovieID = m.MovieID) _
Select m

Другие советы

Если в таблице «Показы» нет записи, то весь объект в запросе должен быть пустым.Дата никогда не должна вступать в игру при таком сценарии.Левое соединение будет записано следующим образом, выбирая только те фильмы, показ которых отсутствует.

Dim query = From m In dbContext.Movies _
            Group Join s In dbContext.Showing On m.ID Equals s.MovieID Into g = Group _
            From item In g.DefaultIfEmpty() _
            Where item Is Nothing _
            Select m
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top