【问题标题】:How to use WhereAwait from System.Linq.Async with custom bools如何将 System.Linq.Async 中的 WhereAwait 与自定义布尔值一起使用
【发布时间】:2022-01-26 17:11:44
【问题描述】:

我有一个数据库,我对它进行了很多 Where 调用以在 Blazor 中创建一个表。这需要很长时间,因为Where 不是异步的。为了加快速度,我想通过使用 System.Linq.Async 中的 ToAsyncEnumerable().WhereAwait 来更改 Where 语句。

这是我的代码行:

series5 = _context.ChickenSeries.ToAsyncEnumerable().WhereAwait(async serie => await ((serie.DatumWeek5 >= firstDay && serie.DatumWeek5 <= lastDay) && serie.SlaughterHouse.SlaughterHouseId != LeegstandID));

这一行出现的错误: 'bool' 不包含 'GetAwaiter' 的定义......

我该如何解决这个问题?

代码基于的原始帖子: How can I use "Where" with an async predicate? 最后一个答案。

【问题讨论】:

  • 你为什么需要它?因为Where is not Async,它很慢是错误的。这很慢,因为您将ToAsyncEnumerable 放在了桌面上。您必须先申请Where。然后ToListAsync()
  • 其实async操作比同步版本慢。但是在APP Server高负载的情况下,async会放宽服务器的线程使用率。
  • 对于 1 个表,我必须进行 +- 100 次数据库调用。该数据库不在同一台服务器上,因此我想让这些调用异步。这不会让它更快吗?

标签: c# linq asynchronous blazor ix.net


【解决方案1】:

Where 是过滤数据的运算符,它是 DO NOT EXECUTES 查询,它只是为查询定义过滤器。所以Where 不需要asyncs。您必须在IQueryable 上应用它才能过滤数据。

尝试用以下方式重写您的查询:

var result = await _context.ChickenSeries
    .Where(serie => (serie.DatumWeek5 >= firstDay && serie.DatumWeek5 <= lastDay) && serie.SlaughterHouse.SlaughterHouseId != LeegstandID)
    .ToListAsync();

如果还是慢的话,还有选择:

  1. 返回记录数过多
  2. 数据库没有适当的索引,您必须分析 SQL Server 执行计划。

【讨论】:

  • 谢谢你的回答,如果我理解正确的话。哪里不让数据传输更小?是数据回来时使用的过滤器?
  • 不,它用于生成 SQL 的WHERE 部分。所以数据在 SQL Server 端进行过滤,使得服务器返回的结果更小。
  • 从阅读docs开始
  • 我试图实现这一点,但我没有得到任何结果?该行没有返回任何内容,我做错了什么?
  • 过滤器可能不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
  • 2017-03-04
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
相关资源
最近更新 更多