2012-09-14 11 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 

मुझे लगता है कि यह आसान होना चाहिए और मुझे लगता है कि यह एक आम आवश्यकता होगी , फिर भी मैं इसे समझ नहीं सकता और न ही मुझे वेब खोजने के माध्यम से समाधान मिला है।

ऐप एक ईएफ मॉडल द्वारा समर्थित डब्ल्यूपीएफ में है। चूंकि ईएफ जॉइन टेबल को छुपाता है, इसलिए मुझे LINQ सिंटैक्स की आवश्यकता होती है जो मध्यस्थ तालिका की अनुपस्थिति से निपट सकती है।

क्लासिक कई से अधिक लोगों को एक साधारण जॉइन टेबल के साथ: तालिका 1: सिनेमा, तालिका 2: शैलियों, तालिका में शामिल हों: मूवीगेनर्स। यूआई में उपयोगकर्ता एक specfic फिल्म का चयन करता है। उस फिल्म के लिए मैं सभी शैलियों और एक बूल वैल्यू वापस लेना चाहता हूं जो दर्शाता है कि शैली को फिल्म को सौंपा गया है या नहीं। LINQ में इसका प्रयास करने के घंटे मुझे विफल कर चुके हैं, इसलिए समाधान वर्तमान में मेरे लिए मूल्य उत्पन्न करने के लिए संग्रहीत प्रक्रिया है। मैं हमेशा संग्रहीत प्रक्रिया के साथ ऐसा करने के लिए तैयार नहीं रहूंगा और LINQ समाधान देखना पसंद करूंगा।

यहाँ वास्तविक एसक्यूएल है तालिका संरचनाओं

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

इस चाल करना चाहिए। एक join

  • DefaultIfEmpty के लिए

    • उपयोग from और in नेविगेशन संपत्ति के साथ यह एक छोड़ दिया में शामिल होने
    • बनाने के लिए मामले बयान

    क्वेरी के लिए एक त्रिगुट ऑपरेटर ? : का उपयोग करना:

    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

    समस्या यह है कि यह इकाई फ़्रेम है ework, तो MovieGenres तालिका/इकाई संदर्भ में मौजूद नहीं है। ईएफ जॉइन टेबल छुपाता है। इस प्रकार, मुझे एक समाधान की आवश्यकता है जो मूवीगेनर्स – TWDuke

    +0

    की अनुपस्थिति के साथ copes आपका LINQ कोड LINQ से SQL में बहुत अच्छा काम करता है! धन्यवाद – TWDuke

    +0

    @TWDuke - ठीक है, लेकिन आपको हमें अपना इकाई मॉडल दिखाना होगा। अपनी एसक्यूएल टेबल संरचनाओं को प्रदर्शित करने से मैंने – Aducci

    संबंधित मुद्दे