Сгенерированный sql из LINQ to SQL - PullRequest
0 голосов
/ 17 июня 2010

Следующий код

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)
                };

Сгенерированный следующий 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 для ProductName и из-за этого вместо ProductName я просто получаю 0 в моем наборе результатов.Он должен генерировать sql, как показано ниже (где ProductName, как '% hotel%'

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

Спасибо.

1 Ответ

3 голосов
/ 17 июня 2010

В этой строке вы обнаружите проблему:

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

p.ProductName.Contains("hotel") возвращает либо true, либо false, либо в SQL 1 или 0.

*.1010 * Переместите Contains в предложение where и в своем выборе просто используйте:
ProductName = p.ProductName,

Всего:

ProductPricesDataContext db = new 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)
            };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...