2012-09-14 82 views
5

,我想使用LINQ來處理,而不是一個簡單的存儲過程:LINQ查詢在EF - 多對多和交叉連接

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 

我想這應該是簡單的,我認爲這將是一個共同的要求,但我無法弄清楚,也沒有通過搜索網絡找到解決方案。

該應用程序是由EF模型支持的WPF。由於EF隱藏了連接表,我需要LINQ語法來處理中間表的缺失。

經典的多對多簡單連接表:表1:電影,表2:流派,連接表:MovieGenres。在用戶界面中,用戶選擇特定電影。對於那部電影,我想帶回所有的流派和一個布爾值,以表明該類型是否已經分配給電影。在LINQ中嘗試這樣做的時間已經讓我失望了,所以解決方案目前需要上面的存儲過程爲我生成值。我不會一直在用存儲過程來做這件事,並且很樂意看到LINQ解決方案。

下面是實際的SQL表結構

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 

回答

5

這應該做的伎倆。

  • 使用fromin與導航性能的join
  • DefaultIfEmpty,使其左連接
  • 使用三元操作? :的case語句

查詢:

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

問題是這是Entity Fram ework,因此MovieGenres表/實體不存在於上下文中。 EF隱藏了連接表。因此,我需要一個解決方案來應對MovieGenres的缺失 – TWDuke

+0

雖然LINQ代碼在LINQ to SQL方面效果很好!謝謝 – TWDuke

+0

@TWDuke - 好點,但你需要告訴我們你的實體模型。顯示你的sql表結構並沒有幫助 – Aducci