5

代わりに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

これは単純なはずであり、一般的な要件になると思いますが、それを理解することも、Webを検索して解決策を見つけることもできません。

アプリはEFモデルに裏打ちされたWPFにあります。EFは結合テーブルを非表示にするため、中間テーブルがない場合に対処できるLINQ構文が必要です。

単純な結合テーブルを備えた古典的な多対多:表1:映画、表2:ジャンル、結合テーブル:MovieGenres。UIで、ユーザーは特定の映画を選択します。その映画については、すべてのジャンルと、そのジャンルが映画に割り当てられているかどうかを示すブール値を戻したいと思います。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
4

1 に答える 1

5

これでうまくいくはずです。

  • のナビゲーションプロパティを使用fromしてinjoin
  • 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
            };
于 2012-09-14T15:19:30.303 に答える