EF 运行 多个查询 - 如何更改为使用一个查询?
EF Running multiple queries - How can I change to use one query?
我正在查看我网站上每个页面加载 运行 的 SQL 查询量。
下面的方法是 运行ning 1 SQL 查询 Promotion table.
内的 PER entry
public IEnumerable<Promotion> GetPromotionsForStore(Store store)
{
return Get().Where(p => p.ValidForStores.Select(s => s.Id).Contains(store.Id));
}
'ValidForStores' 是一个链接 table,它包含 'Promotion_Id' 和 'Store_Id'。 Get()
基本上最终返回 IDbSet<Promotion>
。
如果我把它写成一个普通的 SQL 查询,我可以带回所有的促销活动,同时仍然进行商店检查,但所有这些都只需要一个查询,但是在这种情况下是 EF 运行s以下查询多次。
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 的期望过高?
很可能您的 Get()
方法正在返回 IEnumerable<Promotion>
。为了执行单个查询,将其替换为 IQueryable<Promotion>
等效项,例如
return context.Promotions.Where(...);
我正在查看我网站上每个页面加载 运行 的 SQL 查询量。
下面的方法是 运行ning 1 SQL 查询 Promotion table.
内的 PER entrypublic IEnumerable<Promotion> GetPromotionsForStore(Store store)
{
return Get().Where(p => p.ValidForStores.Select(s => s.Id).Contains(store.Id));
}
'ValidForStores' 是一个链接 table,它包含 'Promotion_Id' 和 'Store_Id'。 Get()
基本上最终返回 IDbSet<Promotion>
。
如果我把它写成一个普通的 SQL 查询,我可以带回所有的促销活动,同时仍然进行商店检查,但所有这些都只需要一个查询,但是在这种情况下是 EF 运行s以下查询多次。
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 的期望过高?
很可能您的 Get()
方法正在返回 IEnumerable<Promotion>
。为了执行单个查询,将其替换为 IQueryable<Promotion>
等效项,例如
return context.Promotions.Where(...);