2012-09-14 15 views
5

Un procedimiento almacenado simple que quiero manejar con LINQ lugar:consulta LINQ en EF - muchos a muchos y una combinación cruzada

SELECT 
CASE WHEN mg.MovieID IS NULL THEN 0 else 1 end as Selected , 
g.genreID, g.GenreName 
FROM dbo.Genres g LEFT JOIN 
(
    SELECT MovieID, GenreID FROM [dbo].[MovieGenre] m 
    WHERE m.MovieID = @Movie 
) MG 
ON g.[GenreID] = mg.[GenreID] 
ORDER BY g.GenreName 

creo que esto debería ser simple y creo que sería un requisito común , sin embargo, no puedo resolverlo ni he encontrado una solución mediante la búsqueda en la web.

La aplicación está respaldada por WPF con un modelo EF. Como EF oculta la tabla de unión, necesito la sintaxis de LINQ que puede manejar la ausencia de la tabla de intermediarios.

Classic many-to-many con una tabla de unión simple: tabla 1: Películas, tabla 2: Géneros, Unirse a la tabla: MovieGenres. En la interfaz de usuario, el usuario selecciona una película específica. Para esa película, quiero traer TODOS los géneros y un valor bool que indique si el género ha sido asignado a la película. Las horas de intento de esto en LINQ me han fallado, así que la solución es que el procedimiento almacenado anterior genere los valores para mí. No siempre seré capaz de hacer esto con un procedimiento almacenado y me encantaría ver una solución LINQ.

Aquí está el SQL real estructuras de la tabla

CREATE TABLE [dbo].[Genres](
    [GenreID] [int] IDENTITY(1,1) NOT NULL, 
    [GenreName] [nvarchar](15) NOT NULL, 
CONSTRAINT [PK_Genres] PRIMARY KEY CLUSTERED 
(
    [GenreID] ASC 
)) ON [PRIMARY] 

GO 

CREATE TABLE [dbo].[Movies](
    [MovieID] [int] IDENTITY(1,1) NOT NULL, 
    [MovieTitle] [nvarchar](50) NOT NULL, 
CONSTRAINT [PK_Movies] PRIMARY KEY CLUSTERED 
(
    [MovieID] ASC 
)) 
ON [PRIMARY] 
GO 

CREATE TABLE [dbo].[MovieGenre](
    [MovieID] [int] NOT NULL, 
    [GenreID] [int] NOT NULL, 
CONSTRAINT [PK_MovieGenre] PRIMARY KEY CLUSTERED 
(
    [MovieID] ASC, 
    [GenreID] ASC 
)) ON [PRIMARY] 
GO 

ALTER TABLE [dbo].[MovieGenre] WITH CHECK ADD CONSTRAINT [FK_Genres] FOREIGN KEY([GenreID]) 
REFERENCES [dbo].[Genres] ([GenreID]) 
GO 
ALTER TABLE [dbo].[MovieGenre] CHECK CONSTRAINT [FK_Genres] 
GO 
ALTER TABLE [dbo].[MovieGenre] WITH CHECK ADD CONSTRAINT [FK_Movies] FOREIGN KEY([MovieID]) 
REFERENCES [dbo].[Movies] ([MovieID]) 
GO 
ALTER TABLE [dbo].[MovieGenre] CHECK CONSTRAINT [FK_Movies] 
GO 

Respuesta

5

Esto debe hacer el truco.

  • uso from y in con la propiedad de navegación para un join
  • DefaultIfEmpty para que sea a la izquierda unirse a
  • El uso de un operador ternario ? : para la declaración de caso

Consulta:

var query = from g in context.Genres 
      from m in g.Movies.Where(x => x.MovieID == movieId) 
           .DefaultIfEmpty() 
      orderby g.GenreName 
      select new { 
       Selected = m == null ? 0 : 1, 
       g.genreID, 
       g.GenreName 
      }; 
+0

El problema es que esto es Entity Fram ework, entonces la tabla/entidad MovieGenres NO existe en el contexto. EF oculta la tabla de unión. Por lo tanto, necesito una solución que haga frente a la ausencia de MovieGenres – TWDuke

+0

¡Su código LINQ funciona muy bien en LINQ to SQL! Gracias – TWDuke

+0

@TWDuke - Bien, pero tiene que mostrarnos su modelo de entidad. Mostrar las estructuras de la tabla sql no ayuda – Aducci

Cuestiones relacionadas