EF 运行多个查询 - 如何更改为使用一个查询?

Posted

技术标签:

【中文标题】EF 运行多个查询 - 如何更改为使用一个查询?【英文标题】:EF Running multiple queries - How can I change to use one query? 【发布时间】:2016-09-30 10:33:53 【问题描述】:

我正在查看我网站上每个页面加载运行的 SQL 查询数量。

以下方法在 Promotion 表中运行 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&lt;Promotion&gt;

如果我把它写成一个普通的 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 的期望过高?

【问题讨论】:

我可以建议您从数据库中获取一次数据,然后对每个条目执行您的操作。 Get()方法的返回type是什么? 【参考方案1】:

您的Get() 方法很可能返回IEnumerable&lt;Promotion&gt;。为了执行单个查询,请将其替换为等效的 IQueryable&lt;Promotion&gt;,例如

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

【讨论】:

你说得对,我在服务上使用了错误的方法。 Get() 返回 IEnumerable&lt;T&gt; 但我还有一个叫 public IQueryable&lt;T&gt; GetQueryable() 我应该使用它。

以上是关于EF 运行多个查询 - 如何更改为使用一个查询?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 EF 上运行 SQL 查询?

在将多个或批量插入查询更改为 PDO 时需要帮助

如何在sql查询中将列更改为行

如何通过一个数据库往返执行两个 EF linq 查询

如何在没有 DB 的情况下将 sql 查询更改为 laravel 模型查询

如何优化 EF 查询?