2016-06-01 8 views
0

私のウェブサイトで1ページの負荷で実行されているSQLクエリの量を確認しています。EF複数のクエリを実行する - 1つのクエリを使用するように変更するにはどうすればよいですか?

次のメソッドは、1つのSQLクエリPERエントリをプロモーションテーブル内で実行しています。

public IEnumerable<Promotion> GetPromotionsForStore(Store store) 
{ 
    return Get().Where(p => p.ValidForStores.Select(s => s.Id).Contains(store.Id)); 
} 

'ValidForStores' 'はPromotion_Id' と 'STORE_ID' が含まリンクテーブルです。 Get()は基本的にIDbSet<Promotion>を返すようになります。

これを通常のSQLクエリとして書いていたのであれば、まだストアチェックを行いながらすべてのプロモーションを取り戻すことができましたが、この場合はEFが複数回以下のクエリを実行します。

SELECT 
[Extent2].[Id] AS [Id], 
[Extent2].[StoreName] AS [StoreName], 
[Extent2].[IsDefault] AS [IsDefault], 
[Extent2].[ThemeName] AS [ThemeName], 
[Extent2].[AdminStore] AS [AdminStore], 
[Extent2].[UrlAffix] AS [UrlAffix], 
[Extent2].[WebsiteId] AS [WebsiteId], 
[Extent2].[CategoryId] AS [CategoryId] 
FROM [dbo].[PromotionStore] AS [Extent1] 
INNER JOIN [dbo].[Store] AS [Extent2] ON [Extent1].[Store_Id] = [Extent2].[Id] 
WHERE [Extent1].[Promotion_Id] = 41 

誰かが単一のクエリが使用されていることを意味する変更を提案できますか、あまりにもEFから期待していますか?

+0

ため、IQueryable<Promotion>同等と交換してください。 –

+1

'Get()'メソッドの返り値**型**は何ですか? –

答えて

2

おそらくGet()メソッドがIEnumerable<Promotion>を返している可能性があります。単一のクエリを実行するために、私は一度DBからデータを取得し、各エントリのためにそれにあなたの操作を実行するために、あなたをお勧めすることができますどのようなインスタンス

return context.Promotions.Where(...); 
+0

あなたは正しいです、私は私のサービスで間違った方法を使用していました。 'Get()'は 'IEnumerable 'を返しますが、もう1つは 'public IQueryable GetQueryable()'です。 – webnoob

関連する問題