我正在使用EF6,并希望使以下查询完全异步:
await MyDataContext.ADbSet.
First(a => a.Something == "Something").
ASubCollection.
Select(x => new { x.SubCollectionId }).
ToListAsync();
我认为这行不通,因为First()
返回了实际的实体并可以访问,ASubCollection
而ICollection
不是IQueryable
。
我可以使用以下代码解决此问题:
await MyDataContext.ADbSet.
Where(a => a.Something == "Something").
SelectMany(a => a.ASubCollection).
Select(x => new { x.SubCollectionId }).
ToListAsync();
但是,这似乎是“ hacky”,因为我在编译时Where(...)
应该使用a时知道应该有一个First()
完全满足查询条件的元素。有更好的方法吗?
对First()
的调用实际上是枚举基础序列并返回一个实体而不是的调用Task
。因此,First()
不能与await
-keyword一起使用。
在这种情况下,您的第二个解决方案是完全有效的(根本不是“ hacky”),因为无需在生成的数据库查询中添加限制,因为Where(...)
在这种特殊情况下-call将恰好返回一个元素-使用或在查询中没有限制。
如果Where
-call可能返回多个元素,或者您只是想确保仅考虑第一个元素,则插入调用Take(1)
将带来序列的第一个元素,但仍然是一个IQueryable
:
await MyDataContext.ADbSet
.Where(a => a.Something == "Something")
.Take(1)
.SelectMany(a => a.ASubCollection)
.Select(x => new { x.SubCollectionId })
.ToListAsync();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句