[英]how to correct the following linq?
我有以下LINQ語句:
var inspectorAllocSummary = context
.UserDetails
.Where(ud => ud.PerformAudit == true && ud.Valid == true)
.OrderBy(ud => ud.Firstname)
.Select(ud
=> new InspectorWorkStatusModel
{
InspectorName = ud.Firstname,
ToBeCompleted = context
.InspectorWorkAllocations
.Where(x => x.UploadCOESDetails.AuditMonth
== criteria.AuditMonth
&& x.InspectorId == ud.Id)
.Sum(x=> x.ToBeAudited) ?? 0,
Completed = context
.COESDetails
.Where(x => x.UploadCOESDetails.AuditMonth
== criteria.AuditMonth
&& x.InspectorId == ud.Id
&& x.AuditType != null)
.Count()
});
ToBeCompleted
是一個整數,它從數據庫中獲取數據,但如果它是null,我想確保它設置為0
。 我嘗試了以下方法:
ToBeCompleted = context
.InspectorWorkAllocations
.Where(x => x.UploadCOESDetails.AuditMonth == criteria.AuditMonth
&& x.InspectorId == ud.Id)
.Sum(x=> x.ToBeAudited) ?? 0
但是我收到以下錯誤:
接線員'??' 不能應用於'int'和'int'類型的操作數
如果返回數據為null
,如何確保將其設置為零?
如果ToBeAudited
是一個int
那么Sum
永遠不會返回null
,它總是返回一個int
。 如果集合是空的,它將返回0.只是起飛?? 0
?? 0
。
但是,如果生成的SQL不返回任何記錄,則Linq-to-SQL和Linq-to-Entities 可能會拋出錯誤。 對於Linq-to-SQL,一個“修復”是將底層字段轉換為可空類型:
.Sum(x=> (int?)x.ToBeAudited) ?? 0
對於Linq-to-Entities,修復方法是調用.DefaultIfEmpty()
:
.Select(x=> x.ToBeAudited)
.DefaultIfEmpty(0)
.Sum()
首先,您需要將ToBeAudited
的類型ToBeAudited
為int?
。 問題來自於int
是值類型並且不能包含null
的事實。 這就是為什么在你的第一種方法中你得到錯誤:
轉換為值類型“Int32”失敗,因為實現值為null。
有一個Sum
重載,它接受可以為空的值。 因此,在ToBeAudited
可以為空之后,這就足夠了:
ToBeCompleted = context
.InspectorWorkAllocations
.Where(x => x.UploadCOESDetails.AuditMonth == criteria.AuditMonth
&& x.InspectorId == ud.Id)
.Sum(x => x.ToBeAudited).Value;
你不需要??
運算符,因為null
值被自動忽略(對於空序列, Sum
將返回0
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.