2012-09-14 25 views
5

私が代わりにLINQで処理したい簡単なストアドプロシージャの参加:私はこれは簡単であるべきだと思う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を検索して解決策を見つけられませんでした。

アプリはWPFでEFモデルをサポートしています。 EFは結合テーブルを隠すので、中間テーブルがないことに対応できるLINQ構文が必要です。

単純な結合テーブルを持つクラシック多対多:表1:ムービー、表2:ジャンル、結合テーブル:MovieGenres。ユーザは、UIにおいて、特定の映画を選択する。その映画のために、私はすべてのジャンルと、そのジャンルが映画に割り当てられているかどうかを示すブール値を戻したい。 LINQでこれを試してみると何時間も失敗しました。そのため、現在のところ、上記のストアドプロシージャで私の値を生成するソリューションがあります。私は常にストアドプロシージャでこれを行うためにabeではなく、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

です。

:それ左はcase文

クエリのための三項演算子? :を使用して

  • に参加するようにするjoin
  • DefaultIfEmptyためのナビゲーションプロパティを持つ

    • 使用fromin
      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