我正在查看我网站上每页面加载的SQL查询量。
以下方法在Promotion表中运行1个SQL查询PER条目。
public IEnumerable<Promotion> GetPromotionsForStore(Store store)
{
return Get().Where(p => p.ValidForStores.Select(s => s.Id).Contains(store.Id));
}
&#39; ValidForStores&#39;是一个链接表,其中包含&#39; Promotion_Id&#39;和&#39; Store_Id&#39;。 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 :(得分:2)
您的Get()
方法很可能正在返回IEnumerable<Promotion>
。要执行单个查询,请将其替换为IQueryable<Promotion>
等效项,例如
return context.Promotions.Where(...);