2016-06-01 4 views
0

내 웹 사이트에서 페이지로드 당 실행되는 SQL 쿼리의 양을 검토 중입니다.EF 여러 쿼리 실행 - 어떻게 한 쿼리를 사용하도록 변경할 수 있습니까?

다음 메소드는 프로모션 테이블에서 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() 메소드의 return ** type **은 무엇입니까? –

답변

2

대부분 Get() 메서드가 IEnumerable<Promotion>을 반환합니다. 하나의 쿼리를 수행하기 위해, 난 당신이 DB에서 데이터를 한 번 가져 오기 다음 각 항목에 대해 그것에 당신의 작업을 수행하는 것이 좋습니다 수있는 것 예를

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

네가 맞다. 나는 내 서비스에서 잘못된 방법을 사용하고 있었다. 'Get()'은'IEnumerable '을 반환하지만 나는 사용해야하는'public IQueryable GetQueryable()'을 가지고있다. – webnoob