簡體   English   中英

實體框架計數異步引發異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM