我需要随机获取一个实体,如下所示,但ElementAtAsync不存在。这是什么原因以及什么是解决方法?为什么ElementAt的异步版本不存在?
var index = random.Next(maxValue:count);
var song = await Context.Songs.ElementAt(index);
我需要随机获取一个实体,如下所示,但ElementAtAsync不存在。这是什么原因以及什么是解决方法?为什么ElementAt的异步版本不存在?
var index = random.Next(maxValue:count);
var song = await Context.Songs.ElementAt(index);
如果你只需要一个元素从数据库中,并且已经有计数,你可以做这样的事情:
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并跳过,而无需订购。 – Freshblood
谢谢你的收获,我修正了我的例子。 –
你也可以使[存储过程](http://stackoverflow.com/questions/19412/how-to-request-a-random-row-in-sql)来做到这一点。 –
我不知道为什么是不存在的,但解决方法可以像下面那样。
var song await = Context.Songs.OrderBy(o => o.Id)
.Skip(index)
.FirstOrDefaultAsync();
此Linq查询将导致相同的结果,但基础查询可能有点不同。
这个例子有什么问题? – Freshblood
可能是你的最后一句话。 –
@RobertHarvey我的意思是说我不确定它是否像ElementAt一样执行相同的SQL查询。如果这个linq查询甚至与ElementAt不完全相同的SQL查询,它将会产生相同的结果。 – Freshblood
ElementAtAsync不存在,原因与任何其他语言/框架不存在相同。好处并没有超过成本。 –
经过反思,ElementAt可能花费多少时间?微软的指导原则是,如果执行需要50ms或更少的时间,那么它不一定是异步的。 –