C# 从LINQ到sql生成的sql

C# 从LINQ到sql生成的sql,c#,linq-to-sql,C#,Linq To Sql,以下代码 ProductPricesDataContext db = new ProductPricesDataContext(); var products = from p in db.Products where p.ProductFields.Count > 3 select new { ProductIDD = p.ProductId,

以下代码

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
为什么这是ProductName的CASE语句,因为它而不是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%'

谢谢。

这一行就是您遇到问题的地方:

ProductName = p.ProductName.Contains("hotel"),
p.ProductName.Contains(“hotel”)
返回
true
false
,或在SQL
1
0
中返回

Contains
移动到
where
子句,然后在您的选择中使用:

ProductName = p.ProductName,
总而言之:

ProductPricesDataContext db=新的ProductPricesDataContext()


这一行就是您遇到问题的地方:

ProductName = p.ProductName.Contains("hotel"),
p.ProductName.Contains(“hotel”)
返回
true
false
,或在SQL
1
0
中返回

Contains
移动到
where
子句,然后在您的选择中使用:

ProductName = p.ProductName,
总而言之:

ProductPricesDataContext db=新的ProductPricesDataContext()


如果我必须返回包含“hotel”的产品名称,我需要将其添加到Where?这一行只是返回true或false,返回的产品名称是否包含“hotel”?@Muhammad Kashif Nadeem-contains函数返回一个布尔值。如果要将结果限制在产品名称包含
hotel
,则它属于where子句。选择时,结果集将只包含与where子句匹配的结果。如果我必须返回ProductName包含“hotel”,我需要将其添加到where?中,此行仅返回true或false,返回的ProductName是否包含“hotel”?@Muhammad Kashif Nadeem-the
Contains
函数返回一个布尔值。如果要将结果限制为产品名称包含
hotel
的结果,则它属于where子句。选择时,结果集将仅包含与where子句匹配的结果。