我想用LINQ处理的简单存储过程:
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。在UI中,用户选择特定的电影。对于那部电影,我想带回所有类型和一个bool值,表明该类型是否已分配给电影。在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
答案 0 :(得分:5)
这应该可以解决问题。
from
和in
与join
DefaultIfEmpty
使其成为左连接? :
作为案例陈述查询:
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
};