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
       .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 ステートメントを生成する必要があります。

于 2013-08-19T12:03:17.417 に答える
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 に答える