将查询转换为lambda

时间:2013-08-19 11:51:17

标签: linq lambda

我想知道如何编写此查询:

var query = from p in context.DimProduct
        from psc in context.DimProductSubcategory
        // on psc.ProductCategoryKey equals pc.ProductCategoryKey
        where psc.EnglishProductSubcategoryName == subCategoryName
              && psc.ProductSubcategoryKey == p.ProductSubcategoryKey
        select new DimProductDTO
                   {
                       ProductKey = p.ProductKey,
                       ProductSubcategoryKey = p.ProductSubcategoryKey,
                       EnglishProductName = p.EnglishProductName,
                       Size = p.Size,
                       StandardCost = p.StandardCost
                   };

我尝试了一些查询,但没有成功。我的问题是我不知道如何访问DimProduct和DimProductSubcategory。

有什么建议吗?

2 个答案:

答案 0 :(得分:1)

这不是完全相同的查询,但它通过内连接产生相同的结果(我相信它比交叉连接更有效)

context.DimProduct
       .Join(context.DimProductSubcategory
                 .Where(x => x.EnglishProductSubcategoryName == subCategoryName),
             p => ProductSubcategoryKey,
             psc => ProductSubcategoryKey,
             (p,psc) => new { p, psc })
       .Select(x => new DimProductDTO {
                       ProductKey = x.p.ProductKey,
                       ProductSubcategoryKey = x.p.ProductSubcategoryKey,
                       EnglishProductName = x.p.EnglishProductName,
                       Size = x.p.Size,
                       StandardCost = x.p.StandardCost })

您的原始查询也可以重写为

var query = from p in context.DimProduct
            join psc in context.DimProductSubcategory
               on p.ProductSubcategoryKey equals psc.ProductSubcategoryKey
            where psc.EnglishProductSubcategoryName == subCategoryName
            select new DimProductDTO {    
                   ProductKey = p.ProductKey,
                   ProductSubcategoryKey = p.ProductSubcategoryKey,
                   EnglishProductName = p.EnglishProductName,
                   Size = p.Size,
                   StandardCost = p.StandardCost
            };

生成的SQL将如下所示:

SELECT [t0].[ProductKey], [t0].[ProductSubcategoryKey]
FROM [DimProduct] AS [t0]
INNER JOIN [DimProductSubcategory] AS [t1] 
    ON [t0].[EnglishProductSubcategoryName] = [t1].[ProductSubcategoryKey]
WHERE [t1].[EnglishProductSubcategoryName] = @p0

答案 1 :(得分:1)

context.DimProduct
       .SelectMany(p => new { p, psc = context.DimProductSubcategory })
       .Where(x => x.psc.EnglishProductSubcategoryName == subCategoryName
              && x.psc.ProductSubcategoryKey == x.p.ProductSubcategoryKey)
       .Select(x => new DimProductDTO {
                       ProductKey = x.p.ProductKey,
                       ProductSubcategoryKey = x.p.ProductSubcategoryKey,
                       EnglishProductName = x.p.EnglishProductName,
                       Size = x.p.Size,
                       StandardCost = x.p.StandardCost })

但是,您没有从DimProductSubcategory中选择任何内容,因此我认为使用Any()扩展方法可以做同样的事情:

context.DimProduct
       .Where(x => context.DimProductSubcategory
                          .Any(y => y.EnglishProductSubcategoryName == subCategoryName
                                 && y.ProductSubcategoryKey == x.ProductSubcategoryKey))
       .Select(x => new DimProductDTO {
                       ProductKey = x.ProductKey,
                       ProductSubcategoryKey = x.ProductSubcategoryKey,
                       EnglishProductName = x.EnglishProductName,
                       Size = x.Size,
                       StandardCost = x.StandardCost });

它应该在查询中生成IN SQL语句。