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
問題是這是Entity Fram ework,因此MovieGenres表/實體不存在於上下文中。 EF隱藏了連接表。因此,我需要一個解決方案來應對MovieGenres的缺失 – TWDuke
雖然LINQ代碼在LINQ to SQL方面效果很好!謝謝 – TWDuke
@TWDuke - 好點,但你需要告訴我們你的實體模型。顯示你的sql表結構並沒有幫助 – Aducci