[英]Entity Framework Count Async Throws Exception
我們進行了同步通話,以獲取滿足特定條件的處置數量。 工作查詢如下所示。
itemsCount = _db.Disposals
.Include(d => d.ItemIds)
.AsEnumerable()
.Where(d => d.OrganizationId == SelectedOrganizationID &&
d.CreateDateTime.UtcDateTime > greaterThen.ToUniversalTime() &&
d.CreateDateTime.UtcDateTime < lessThen.ToUniversalTime())
.SelectMany(d => d.ItemIds)
.Count();
我需要使查詢異步。 看來我需要一個IQueryable才能在其上運行CountAsync 。 我不明白上面的代碼為什么首先具有.AsEnumerable()
,以及為什么下面的代碼引發異常:
mscorlib.dll中發生類型'System.NotSupportedException'的第一次機會異常
itemsCount = await _db.Disposals
.Include(d => d.ItemIds)
.Where(d => d.OrganizationId == SelectedOrganizationID &&
d.CreateDateTime.UtcDateTime > greaterThen.ToUniversalTime() &&
d.CreateDateTime.UtcDateTime < lessThen.ToUniversalTime())
.SelectMany(d => d.ItemIds)
.CountAsync();
我真的只是在尋找為什么異步計數不起作用的原因(項目確實可以構建,但是會引發異常)。 但是,了解為什么使用AsEnumerable()
將是一個好處。
PS我知道,當我在它前面等待時,它並沒有異常運行,僅用於測試。 _db
是EF數據庫上下文。
編輯:編寫為時仍會引發異常:
var greaterThanUtc = greaterThen.ToUniversalTime();
var lessThanUtc = greaterThen.ToUniversalTime();
itemsCount = await _db.Disposals
.Include(d => d.ItemIds)
.Where(d => d.OrganizationId == SelectedOrganizationID &&
d.CreateDateTime.UtcDateTime > greaterThanUtc &&
d.CreateDateTime.UtcDateTime < lessThanUtc)
.SelectMany(d => d.ItemIds)
.CountAsync();
mscorlib.dll中發生類型'System.NotSupportedException'的第一次機會異常
編輯2:
我認為問題是嘗試將SQL(datetimeoffset)中的Date字段轉換為d.CreateDateTime.UtcDateTime,我想EF根本不支持此功能。
函數調用ToUniversalTime()
無法轉換為存儲表達式,因此不能在數據庫端運行。
.AsEnumerable()
使它之后的所有內容都在客戶端上運行,因此您可以使用該.NET方法。
請注意,運行過多的客戶端通常不是一個好主意。 ToUniversalTime()
的調用發生在看起來是局部變量的地方。 你可以這樣
var greaterThanUtc = greaterThen.ToUniversalTime()
然后在查詢中使用而不使用.ToUniversalTime();
lessThen
相同。
UPDATE
如果您的數據庫字段是datetimeoffset
,則必須在C#中使用DateTimeOffset。 請參見實體框架將DateTimeOffset映射到SQL Server DateTime
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.