2016-11-19 15 views
1

我正在使用ASP.NET Core與實體框架。Entify框架 - 異步選擇與在哪裏條件

首先,我選擇一個員工,然後滿足條件的(用於顯示的目的是什麼在起作用)所有員工:

var a = db.Employee.FirstOrDefault(); 
var b = db.Employee.Where(x => x.FirstName == "Jack"); 

現在,我嘗試同樣的,但異步:

var c = await db.Employee.FirstOrDefaultAsync(); 
var d = await db.Employee.Where(x => x.FirstName == "Jack"); 

但是,對於「WHERE」沒有異步版本,並且第二行代碼不能編譯 - 我得到一個錯誤

...不包含GetAwaiter定義...

如何進行SELECT在這種情況下WHERE條件?


好的,從答案我看到ToListAsync()將解決「var d = ...」行。但是,這個問題仍然存在,我之前並不知道它很重要。在這種情況下,我只是試圖選擇一組將被刪除的記錄,對於在代碼中進一步處理數據的目的,我不感興趣訪問數據。所以我修改了所有4個代碼版本,目的是同步或異步地刪除一個或多個記錄。爲什麼只有最後一個需要一個ToListAsync(),不會實際從數據庫中檢索記錄?

var a = db.Employee.FirstOrDefault(); 
db.Employee.Remove(a); 
// db.Employee.RemoveRange(a); <- this also works? 
db.SaveChanges(); 

var b = db.Employee.Where(x => x.FirstName == "Jack"); 
db.Employee.RemoveRange(b); 
db.SaveChanges(); 

var c = await db.Employee.FirstOrDefaultAsync(); 
db.Employee.Remove(c); 
await db.SaveChangesAsync(); 

var d = await db.Employee.Where(x => x.FirstName == "Jack").ToListAsync(); 
db.Employee.RemoveRange(d); 
await db.SaveChangesAsync(); 
+1

使用ToArrayAsync,ToListAsync。 – Evk

+0

謝謝,請參閱問題的延續。 – Marko

+0

RemoveRange將首先從數據庫中提取所有項目,然後標記爲已刪除。因此,首先調用ToListAsync是沒有害處的 - 否則它將由RemoveRange本身完成(同步)。 – Evk

回答

5

你可以這樣做。

如果您需要檢索一個對象,則:

var d = await db.Employee.FirstOrDefaultAsync(x => x.FirstName == "Jack"); 

如果您需要檢索列表,則:

var d = await db.Employee.Where(x => x.FirstName == "Jack").ToListAsync(); 
+0

謝謝,請參閱問題的繼續。 – Marko