2010-08-03 90 views
0

這是SQL查詢我試圖使用LINQ寫:LINQ to SQL的嵌套查詢

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' 

這是LINQ我有:

_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()); 

這是它產生的查詢:

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'/' 

任何想法我做錯了什麼?

回答

3

通過改變這樣的:

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

爲:產生

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

正確的SQL。