Pregunta

Así que mi situación es que tengo un modelo LINQ a SQL que no permite que las fechas sean nulos en una de mis mesas. Con ello se pretende, porque la base de datos no permite nulos en ese campo. Mi problema es que cuando trato de escribir una consulta LINQ con este modelo, no puedo hacer una izquierda se unen a esa mesa más porque la fecha no es un campo 'anulable' y así que no puedo comparar con "nada".

Ejemplo: Hay una mesa de Película, {ID, MovieTitle}, y una mesa de Proyecciones, {ID, MovieID, ShowingTime, Localización}

Ahora estoy tratando de escribir una declaración que devolverá todas esas películas que no tienen proyecciones. En este T.SQL se vería así:

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

Ahora en esta situación que podría poner a prueba para Null en el campo 'Localización', pero esto no es lo que tengo en la realidad (sólo un ejemplo simplificado). Todo lo que tengo son fechas que no son nulos.

Estoy tratando de escribir en 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

Sin embargo, yo estoy recibiendo un error que dice

operador 'es' no acepta operandos de tipo 'Fecha'. Operandos deben ser de referencia o anulables tipos.

¿Hay alguna forma de evitar esto? El modelo es correcto, nunca debería ser un nulo en las Proyecciones: mesa de Showtime. Pero si lo hace una combinación izquierda, y no hay horarios de los espectáculos para una película en particular, entonces ShowTime debe haber nada de esa película ...

Gracias a todos por su ayuda.

¿Fue útil?

Solución

El uso de un LEFT JOIN no es realmente ayudando aquí. Dado que no puede haber ningún resultado en la tabla de la derecha, puede ser que también acaba de recuperar la tabla de la izquierda y sólo la izquierda. Este es un simple "no" / "no existe" consulta:

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

Otros consejos

Si no hay un registro en la tabla Proyecciones, a continuación, todo el objeto de la consulta debe ser nada. La fecha nunca debe entrar en juego bajo un escenario de este tipo. Una combinación izquierda se escribe así, seleccionando sólo las películas en las que no se encuentra la proyección

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top