0

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

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。

有什么建议么?

4

2 回答 2

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
于 2013-08-19T11:56:57.867 回答
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 });

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

于 2013-08-19T12:03:17.417 回答