2016-03-05 66 views
3

.ToListAsync用於從EF核心中的數據庫中獲取項目的集合。這很清楚。但是,獲得單件物品的正確方法是什麼?如果可能,以異步方式。實體框架核心(7):按ID加載單個實體

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(); 
    } 
} 

回答

3

您應該使用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即可。

+1

我很難在EF Core中找到Queryable.FooAsync()方法。我需要引用其他一些軟件包嗎?編輯 沒關係。我不得不添加'使用Microsoft.EntityFrameworkCore;'我覺得它是這樣的。不幸的是,EF Core似乎沒有在任何地方發佈API文檔。 –

+1

@Homr Zodyssey,關於'使用Microsoft.EntityFrameworkCore的好消息;'那些Async不是Linq的一部分,而是EFCore的一部分。 – Konstantin

1

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

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