2014-05-03 16 views
1

我需要随机获取一个实体,如下所示,但ElementAtAsync不存在。这是什么原因以及什么是解决方法?为什么ElementAt的异步版本不存在?

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

ElementAtAsync不存在,原因与任何其他语言/框架不存在相同。好处并没有超过成本。 –

+0

经过反思,ElementAt可能花费多少时间?微软的指导原则是,如果执行需要50ms或更少的时间,那么它不一定是异步的。 –

回答

2

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

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 
+2

您无法使用Take并跳过,而无需订购。 – Freshblood

+0

谢谢你的收获,我修正了我的例子。 –

+0

你也可以使[存储过程](http://stackoverflow.com/questions/19412/how-to-request-a-random-row-in-sql)来做到这一点。 –

0

我不知道为什么是不存在的,但解决方法可以像下面那样。

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

此Linq查询将导致相同的结果,但基础查询可能有点不同。

+0

这个例子有什么问题? – Freshblood

+0

可能是你的最后一句话。 –

+0

@RobertHarvey我的意思是说我不确定它是否像ElementAt一样执行相同的SQL查询。如果这个linq查询甚至与ElementAt不完全相同的SQL查询,它将会产生相同的结果。 – Freshblood

相关问题