9

我正在使用 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”,因为我在使用 aWhere(...)时应该使用 a First(),因为我在编译时知道将只有一个元素满足查询。有没有更好的方法来做到这一点?

4

1 回答 1

7

调用First()是实际枚举底层序列并返回一个实体而不是一个Task. 因此First()不能与await-keyword 一起使用。

在这种情况下,您的第二个解决方案是完全有效的(根本不是“hacky”),因为不需要对生成的数据库查询添加限制,因为Where(...)在这种特殊情况下 -call 将只返回一个元素 - 使用 or在查询中没有限制。

如果Where-call 可能返回多个元素,或者您只是想确保只考虑第一个元素,则插入调用 toTake(1)将带来序列的第一个元素,但仍然是IQueryable

await MyDataContext.ADbSet
                   .Where(a => a.Something == "Something")
                   .Take(1)
                   .SelectMany(a => a.ASubCollection)
                   .Select(x => new { x.SubCollectionId })
                   .ToListAsync();
于 2013-10-16T14:45:21.827 回答