【问题标题】:Why does an async version of ElementAt not exist?为什么 ElementAt 的异步版本不存在?
【发布时间】:2014-05-03 15:57:53
【问题描述】:

我需要随机获取一个实体,如下所示,但 ElementAtAsync 不存在。这是什么原因?有什么解决方法?

var index = random.Next(maxValue:count);
var song = await Context.Songs.ElementAt(index);

【问题讨论】:

  • ElementAtAsync 不存在的原因与任何其他语言/框架不存在的原因相同。收益并没有超过成本。
  • 经过反思,ElementAt 可能需要多长时间? Microsoft 的指导方针是,如果执行时间不超过 50 毫秒,则不必将其设为异步。

标签: c# .net entity-framework entity-framework-6 iqueryable


【解决方案1】:

如果你只需要数据库中的一个元素,并且你已经有了计数,你可以这样做:

var index = random.Next(maxValue:count);
var songQuery = await Context.Songs
                             .OrderyBy(x => x.Something) 
                             .Skip(index)
                             .Take(1)
                             .ToListAsync();
var song = songQuery.SingleOrDefault(); // this works due to the Take(1) above

【讨论】:

  • 不点单就不能使用 Take and skip。
  • 感谢您的关注,我修正了我的示例。
  • 您也可以创建stored procedure 来执行此操作。
【解决方案2】:

我不确定为什么它不存在,但解决方法可能如下所示。

var song await = Context.Songs.OrderBy(o => o.Id)
                        .Skip(index)
                        .FirstOrDefaultAsync();

此 Linq 查询将导致相同的结果,但底层查询可能会有所不同。

【讨论】:

  • 可能是你的最后一句话。
  • @RobertHarvey 我的意思是我不确定它是否与 ElementAt 执行相同的 sql 查询。如果这个 linq 查询与 ElementAt 甚至不是完全相同的 sql 查询,它也会导致完全相同的结果。
  • 我投了反对票,因为我不喜欢你接受@ChristoperStevenson 的知识/想法,并且由于他的回答中有一个小错误,你回答你自己的问题。这就是为什么我赞成克里斯托弗的答案而反对你的答案,如果你接受自己的答案而不是克里斯托弗的答案,我会更加失望。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
相关资源
最近更新 更多