如何使用LINQ異步調用帶有子記錄的數據庫?

async-await c#-5.0 datacontext entity-framework-6 linq

我正在使用EF6並希望使以下查詢完全異步:

 await MyDataContext.ADbSet.
                     First(a => a.Something == "Something").
                     ASubCollection.
                     Select(x => new { x.SubCollectionId }).
                     ToListAsync();

這不起作用,我相信由於First()返回實際實體並且訪問ASubCollectionICollection ,而不是IQueryable

我能夠使用以下代碼解決這個問題:

 await MyDataContext.ADbSet.
                     First(a => a.Something == "Something").
                     ASubCollection.
                     Select(x => new { x.SubCollectionId }).
                     ToListAsync();

然而,這似乎是“hacky”因為我在使用Where(...)時我應該使用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();



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因