3

以下は私が翻訳しようとしているSQLクエリです

SELECT dbo.Contracts.Supplier 
FROM dbo.Contracts INNER JOIN dbo.Products ON dbo.Contracts.Product = dbo.Products.Product
where dbo.Products.ProductGroup='Crude'
GROUP BY dbo.Contracts.Supplier

次のLINQで同じ結果が得られないため、何か間違ったことをしていますか?

     var result = from c in context.Contracts
                     join p in context.Products on c.Product equals p.Product1
                     where p.Product1.Equals("Crude")
                     group c by c.Supplier into g    
                     select new { supplier = g.Key  };

奇妙なステートメントを生成しています

SELECT 
1 AS [C1], 
[Distinct1].[Supplier] AS [Supplier]
FROM ( SELECT DISTINCT 
[Extent1].[Supplier] AS [Supplier]
FROM [dbo].[Contracts] AS [Extent1]
WHERE N'Crude' = [Extent1].[Product]
)  AS [Distinct1]

個別を使用すると機能しますが、同じ結果を得るには、LINQは次のようなステートメントを生成する必要があります(結合を無視しているようです)。

SELECT distinct dbo.Contracts.Supplier 
FROM dbo.Contracts INNER JOIN dbo.Products ON dbo.Contracts.Product = dbo.Products.Product
where dbo.Products.ProductGroup='Crude'
4

1 に答える 1

1

「EntityFramework」または「Linq To SQL」を使用していると仮定しています。navigation propertiesその場合、製品に移動して無効な結果を除外するために使用できるはずです。このようにして、クエリは次のようになります。

var result = (from c in context.Contracts
              where c.Products.Any(p => p.ProductGroup == "Crude")
              select c.Supplier).Distinct();

これは自動的に正しいクエリに変換され (この場合、結合も行わず、Existssql キーワードを使用するだけです)、個別のサプライヤーが返されます。これは、あなたの目的を正しく理解している場合です。「原油」製品グループの製品を含む契約に割り当てられたすべてのサプライヤーを取得したいと考えています。

基本的に、ナビゲーション プロパティを使用できる場合は、joinfromlinq to sqlまたはをできるだけ使用しないようにする必要があります。linq to entitiesシステムはおそらく、それらを特定の に変換する方が優れているでしょうsql

于 2012-07-20T13:27:45.283 に答える