5

深刻なパフォーマンスの問題に直面しています... 私のクエリは、SQL を使用して製品をデータベースで直接フィルタリングすることになっています。このコードを実行すると、実行されず、すべての製品が返され、C# でフィルター処理されます。

MyContext context = new MyContext();

Func<Product, bool> query = (p => p.UPC.StartsWith("817"));

var products = context.Products.Where(query).Take(10);

products 変数が TakeIterator 型であることに気付きました。コードを少し変更すると、フィルタリングは正常に行われますが、クエリ ロジックを同じメソッドに直接配置する必要があり、これは回避したいことです。

MyContext context = new MyContext();

var products = context.Products.Where(p => p.UPC.StartsWith("817")).Take(10);

この 2 番目のバージョンは、Visual Studio デバッガーによって非公開の型ですが、終了しようとしているクエリとして表示されます。これは良いことです!

{SELECT TOP (10) 
[Extent1].[Id] AS [Id], 
[Extent1].[Brand] AS [Brand], 
[Extent1].[Description] AS [Description], 
[Extent1].[UPC] AS [UPC]
FROM [dbo].[Products] AS [Extent1]
WHERE [Extent1].[UPC] LIKE N'817%'}

引数として渡される Func を取得し、最初の C# コードの抜粋と同じ方法でクエリを実行する方法を理解する必要がありますが、2 番目のコードは最適化されています。

4

1 に答える 1