2012-09-14 32 views
5

Một thủ tục lưu trữ đơn giản mà tôi muốn để xử lý với LINQ thay vì:LINQ truy vấn trong EF - nhiều nhiều và một chéo tham gia

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 

Tôi nghĩ rằng điều này sẽ được đơn giản và tôi nghĩ rằng nó sẽ là một yêu cầu chung , nhưng tôi không thể tìm ra và cũng không tìm được giải pháp thông qua tìm kiếm trên web.

Ứng dụng nằm trong WPF được hỗ trợ bởi mô hình EF. Vì EF ẩn bảng kết nối, tôi cần cú pháp LINQ có thể giải quyết được sự vắng mặt của bảng trung gian.

Cổ điển nhiều người với một bảng tham gia đơn giản: bảng 1: Phim, bảng 2: Thể loại, Tham gia bảng: MovieGenres. Trong giao diện người dùng, người dùng chọn một bộ phim đặc biệt. Đối với bộ phim đó tôi muốn mang lại TẤT CẢ các thể loại và giá trị bool cho biết liệu thể loại đã được gán cho bộ phim hay chưa. Giờ cố gắng này trong LINQ đã thất bại cho tôi, do đó, giải pháp hiện tại là có thủ tục lưu trữ ở trên tạo ra các giá trị cho tôi. Tôi sẽ không phải lúc nào cũng phải làm điều này với một thủ tục lưu trữ và rất thích nhìn thấy một giải pháp LINQ.

Đây là SQL thực tế cấu trúc bảng

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 

Trả lời

5

này nên làm các trick.

  • sử dụng fromin với tài sản chuyển hướng cho một join
  • DefaultIfEmpty để làm cho nó một trái tham gia
  • Sử dụng một nhà điều hành ternary ? : cho báo cáo trường hợp

Query:

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

Vấn đề là đây là thực thể Fram ework, vì vậy bảng/thực thể MovieGenres KHÔNG tồn tại trong ngữ cảnh. EF giấu bảng nối. Vì vậy, tôi cần một giải pháp mà đối phó với sự vắng mặt của MovieGenres – TWDuke

+0

Mã LINQ của bạn hoạt động tốt trong LINQ to SQL mặc dù! Cảm ơn – TWDuke

+0

@TWDuke - Ok điểm tốt, nhưng bạn cần cho chúng tôi thấy mô hình tổ chức của bạn. Hiển thị cấu trúc bảng sql của bạn không giúp được – Aducci

Các vấn đề liên quan