2010-06-17 41 views
0

下面的代碼生成的SQL到SQL

ProductPricesDataContext db = new ProductPricesDataContext(); 

var products = from p in db.Products 
       where p.ProductFields.Count > 3 
       select new 
       { 
        ProductIDD = p.ProductId, 
        ProductName = p.ProductName.Contains("hotel"), 
        NumbeOfProd = p.ProductFields.Count, 
        totalFields = p.ProductFields.Sum(o => o.FieldId + o.FieldId) 
       }; 

生成follwing SQL

SELECT [t0].[ProductId] AS [ProductIDD], 

    (CASE 
     WHEN [t0].[ProductName] LIKE '%hotel%' THEN 1 
     WHEN NOT ([t0].[ProductName] LIKE '%hotel%') THEN 0 
     ELSE NULL 
    END) AS [ProductName], 

    (SELECT COUNT(*) FROM [dbo].[ProductField] AS [t2] WHERE [t2].[ProductId] = [t0].[ProductId]) AS [NumbeOfProd], 
    (SELECT SUM([t3].[FieldId] + [t3].[FieldId]) FROM [dbo].[ProductField] AS [t3] WHERE [t3].[ProductId] = [t0].[ProductId]) AS [totalFields] 

FROM [dbo].[Product] AS [t0] 
WHERE ((SELECT COUNT(*) FROM [dbo].[ProductField] AS [t1] WHERE [t1].[ProductId] = [t0].[ProductId])) > 3 

爲什麼是產品名稱這個CASE語句也正因爲如此,而不是產品名稱我只是在我的結果讓0組。它應該生成SQL像以下(其中產品名稱LIKE '%酒店%'

SELECT [t0].[ProductId] AS [ProductIDD], 
    [ProductName], 
    (SELECT COUNT(*) FROM [dbo].[ProductField] AS [t2] WHERE [t2].[ProductId] = [t0].[ProductId]) AS [NumbeOfProd], 
    (SELECT SUM([t3].[FieldId] + [t3].[FieldId]) FROM [dbo].[ProductField] AS [t3] WHERE [t3].[ProductId] = [t0].[ProductId]) AS [totalFields] 

FROM [dbo].[Product] AS [t0] 

WHERE ((SELECT COUNT(*) FROM [dbo].[ProductField] AS [t1] WHERE [t1].[ProductId] = [t0].[ProductId])) > 3 
AND  t0.ProductName like '%hotel%' 

感謝

回答

3

此行是哪裏出現了問題:

ProductName = p.ProductName.Contains("hotel"), 

p.ProductName.Contains("hotel")回報要麼truefalse或SQL中的10

移動Containswhere條款,並在您選擇簡單的使用:

ProductName = p.ProductName, 

產品總數:

ProductPricesDataContext DB =新ProductPricesDataContext();

var products = from p in db.Products 
      where p.ProductFields.Count > 3 
      where p.ProductName.Contains("hotel") 
      select new 
      { 
       ProductIDD = p.ProductId, 
       ProductName = p.ProductName, 
       NumbeOfProd = p.ProductFields.Count, 
       totalFields = p.ProductFields.Sum(o => o.FieldId + o.FieldId) 
      }; 
+0

如果必須返回ProductNames包含'酒店'我需要添加此在哪裏? 這條線剛剛返回true或false,返回的ProductName中包含「hotel」或不是? – Kashif 2010-06-17 19:56:58

+0

@Muhammad Kashif Nadeem - 'Contains'函數返回一個布爾值。如果您想將結果限制爲產品名稱包含「酒店」的結果,那麼它屬於where子句。選擇時,結果集只包含與where子句匹配的結果。 – Oded 2010-06-17 19:59:22