【问题标题】:Linq with number of queries to the same tableLinq 对同一张表的查询次数
【发布时间】:2017-02-03 09:44:40
【问题描述】:

最近我对 Linq 有点头疼。 我有一张大表(超过 100 个字段,用于测试目的超过 40000 行),我们称之为 Products。

Products 表有大约 60 个查询 - 我必须在 Grid 上显示 - 查询是 IQueryable 对象,我正在对每个查询执行 Count()。

每个查询大约需要 100 毫秒(所有查询大约需要 7 秒),因此向用户显示结果需要大量时间。 我应该使用 StoredProcedure,还是有其他解决方案?

最好的问候

编辑: 我的一个查询: var result = (来自 this.Context.Products 中的 f 其中 f.Period == currPeriod && (f.TYPE == 1 || f.TYPE == 2) && f.FLAGA > 0 && f.DATE_OK != null && UsersList.Contains(f.UsersId) 选择新产品列表 {});

在选择新的 ProductList 中,我从 Products 表中获取 10 个字段。 我也知道 Contains 给了我很大的性能问题

【问题讨论】:

  • 你能和我们分享一下问题吗?
  • UsersList 通常包含多少项?顺便说一句,具有 > 100 个字段的表听起来像是不健康的数据库设计,您可能需要一些规范化步骤。
  • 用户列表从100到4000。很难说真的很遗憾我对表格设计没有任何影响:(
  • 100 这应该不是问题。如果是,您必须查看正确的索引。对于较大的数字,您必须以块的形式获取数据:stackoverflow.com/q/24534217/861716.

标签: asp.net-mvc performance linq linq-to-sql


【解决方案1】:

在您的情况下,最好迁移到 Sp,它会更有效,您也可以尝试仅在 LINQ 中使用 Count,但 Select 除外。

【讨论】:

  • 我使用 count 但在 IQueryable 结果对象上,原因是当用户单击网格中的此计数器结果时我将使用此查询。我不想在我的项目中有两次相同的查询,我就是这样走的。
  • 如果您只想获取计数,请避免在查询中选择部分。那将是性能问题。因为如果您使用 IQueryable 您可以在不执行 Select 语句的情况下获得计数。当您需要显示所有数据时,您可以稍后显示
  • 所以我应该做 2 个查询,一个用于计数,一个用于选择?我认为 IQueryable 可以很好地同时处理计数和选择。
  • 请使用 Lambda 表达式来帮助您解决此问题 var reuslt = Context.Products where(f=> f.Period == currPeriod && (f.TYPE == 1 || f. TYPE == 2) && f.FLAGA > 0 && f.DATE_OK != null && UsersList.Contains(f.UsersId)).count();这是延迟查询
  • 不需要 2 个查询,只需将主选择放入 IQueyable 然后您可以分别执行 count 和 Select 方法,如下所示 e var reuslt = Context.Products where(f=> f.Period == currPeriod && (f .TYPE == 1 || f.TYPE == 2) && f.FLAGA > 0 && f.DATE_OK != null && UsersList.Contains(f.UsersId));如果你需要计数:result.Count();如果需要选择:result.select(a=> new ProductLista { name = a.name});
猜你喜欢
  • 2016-09-25
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 2019-02-21
  • 2017-06-30
  • 1970-01-01
  • 1970-01-01
  • 2018-05-09
相关资源
最近更新 更多