2010-08-03 5 views
0

Ceci est la requête SQL que je suis en train d'écrire avec LINQ:Linq sql Nested Sélectionnez

SELECT pd.Description, pd.Name, pd.SKU, pt.FileName, 
(SELECT ISNULL(M1.parent, '') + '/' + M2.parent + '/' + M2.slug 
    FROM seo AS M1 
    JOIN seo AS M2 
    ON M1.Slug = M2.Parent 
    WHERE M2.SeoId = pd.seoId) as Url 
FROM SEO seo 
INNER JOIN Products p on seo.SeoID = p.SeoID 
INNER JOIN RelatedProducts rp on p.ProductID = rp.ProductID 
INNER JOIN Products pd on rp.RelatedID = pd.ProductID 
INNER JOIN ProductPhotos pp on pd.ProductID = pp.ProductID 
INNER JOIN Photos pt on pp.PhotoID = pt.PhotoID 
WHERE seo.slug = 'SlugValue' 

C'est le LINQ J'ai:

_database.SEODataSource 
       .Join(_database.ProductDataSource, seo => seo.SeoID, p => p.SeoID, (seo, p) => new { seo, p }) 
       .Join(_database.RelatedProductDataSource, @t => @t.p.ProductID, rp => rp.ProductID, (@t, rp) => new { @t, rp }) 
       .Join(_database.ProductDataSource, @t => @t.rp.RelatedID, pd => pd.ProductID, (@t, pd) => new { @t, pd }) 
       .Join(_database.ProductPhotoDataSource, @t => @t.pd.ProductID, pp => pp.ProductID, (@t, pp) => new { @t, pp }) 
       .Join(_database.PhotoDataSource, @t => @t.pp.PhotoID, pds => pds.PhotoID, (@t, pds) => new { @t, pds }) 
       .Where(@t => @[email protected]@[email protected]@t.seo.Slug == slug) 
       .Select(@t => new ProductLinkDTO 
       { 
        ProductDesc = @[email protected]@t.pd.Description, 
        ProductName = @[email protected]@t.pd.Name, 
        ProductSku = @[email protected]@t.pd.SKU, 
        ProductImageName = @t.pds.FileName, 
        ProductUrl = (_database.SEODataSource.Join(_database.SEODataSource, seo1 => seo1.SeoID, seo2 => seo2.SeoID, (seo1, seo2) => new {seo1, seo2}) 
            .Where(@t1 => @t1.seo2.SeoID == @[email protected]@[email protected]@t.seo.SeoID) 
            .Select(@t1 => @t1.seo1.Parent ?? "" + "/" + @t1.seo2.Parent + "/" + @t1.seo2.Slug)).FirstOrDefault() 
       }).ToList()); 

C'est la requête qu'elle produit:

SELECT [t3].[Name] AS [ProductName], [t3].[Description] AS [ProductDesc], [t3].[SKU] AS [ProductSku], [t5].[FileName] 
AS [ProductImageName], (
    SELECT TOP (1) [t8].[value] 
    FROM (
     SELECT COALESCE([t6].[Parent],((@p1 + [t7].[Parent]) + @p2) + [t7].[Slug]) AS [value], [t7].[SeoID] 
     FROM [dbo].[SEO] AS [t6] 
     INNER JOIN [dbo].[SEO] AS [t7] ON [t6].[SeoID] = [t7].[SeoID] 
     ) AS [t8] 
    WHERE [t8].[SeoID] = [t0].[SeoID] 
    ) AS [ProductUrl] 
FROM [dbo].[SEO] AS [t0] 
INNER JOIN [dbo].[Products] AS [t1] ON ([t0].[SeoID]) = [t1].[SeoID] 
INNER JOIN [dbo].[RelatedProducts] AS [t2] ON [t1].[ProductID] = [t2].[ProductID] 
INNER JOIN [dbo].[Products] AS [t3] ON [t2].[RelatedID] = [t3].[ProductID] 
INNER JOIN [dbo].[ProductPhotos] AS [t4] ON [t3].[ProductID] = [t4].[ProductID] 
INNER JOIN [dbo].[Photos] AS [t5] ON [t4].[PhotoID] = [t5].[PhotoID] 
WHERE [t0].[Slug] = @p0',N'@p0 nvarchar(4000),@p1 nvarchar(4000),@p2 
nvarchar(4000)',@p0=N'KBUIT4255E-42in-Masterpiece-Side-By-Side',@p1=N'/',@p2=N'/' 

Une idée de ce que je fais mal?

Répondre

3

En changeant ceci:

.Select(@t1 => @t1.seo1.Parent ?? "" + "/" + @t1.seo2.Parent + "/" + @t1.seo2.Slug)).FirstOrDefault() 

Pour:

.Select(@t1 => String.Concat(@t1.seo1.Parent ?? "", "/", @t1.seo2.Parent, "/", @t1.seo2.Slug))).SingleOrDefault() 

SQL correcte a été générée.