實體框架核心(7):通過id加載單個實體

.net async-await c# entity-framework entity-framework-core

.ToListAsync用於從EF Core中的DB獲取項目集合。這很清楚。但獲得單品的正確方法是什麼?如果可能,以異步方式。

public async static Task<Source> LoadEntityAsync(int sourceID)
{
    using (var db = new RPDBContext())
    {
        var sources =
            await
                db.Source
                    .Where(x => x.SourceID == sourceID)
                    .ToListAsync();
        // TODO that's like a hack:
        return sources.First();
    }
}

一般承認的答案

如果希望對SingleOrDefaultAsync唯一的,則應使用SingleOrDefaultAsync 。如果您知道該對像在域限制中是唯一的,或者您通過主鍵訪問它,那麼您可以使用FirstOrDefaultAsync

var sources = await db.Source
            .Where(x => x.SourceID == sourceID)
            .SingleOrDefaultAsync();

您可以使用另一個重載並縮短查詢

var sources = await db.Source
            .SingleOrDefaultAsync(x => x.SourceID == sourceID);

相同的規則適用於FirstOrDefaultAsync

如果要確保該對象存在,只需刪除OrDefault部分並使用SingleAsyncFirstAsync


熱門答案

如果需要檢索單個項目,請使用FirstOrDefaultAsync

public static Task<Source> LoadEntityAsync(int sourceID)
{
    using (var db = new RPDBContext())
    {
        return db.Source.FirstOrDefaultAsync(x => x.SourceID == sourceID);
    }
}


Related

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