我有这个beloq查询给了我一个例外。 现在j.job_quote.JobQuoteID是一个null的标识列,我们试图创建一个检查,如果null,然后标识为0.请帮助为什么我得到问题,我该怎么办来处理它
var Qryjob = (from j in at.jobs
where j.JobID == Convert.ToInt32(jobid)
select new {
JobID = j.JobID,
InsertedDate = j.InsertedDate,
FirstName = j.user.FirstName,
LastName = j.user.LastName,
City = j.user.City,
ServiceName = j.service.ServiceName,
ServiceTypeName = j.service_type.ServiceTypeName,
BudgetName = j.budget.BudgetName,
IsApproved = j.IsApproved,
IsAssigned = j.IsAssigned,
IsQuoted = j.IsQuoted,
job_notif_price = j.job_notif_price,
Description = j.Description,
PaymentTypeName = j.payment_type.PaymentTypeName,
DuePeriodName = j.due_period.DuePeriodName,
QuoteStatus = j.job_quote.QuoteStatus,
JobStatus = j.job_quote.JobStatus,
comments = j.job_quote.comments,
IsPartnerApply = j.job_quote.IsPartnerApply,
Applycomment = j.job_quote.ApplyComments,
JobQuoteID = j.job_quote.JobQuoteID ?? 0
}).ToList();
答案 0 :(得分:31)
??
运算符左侧的变量必须是可空的(这意味着您可以为其赋值为null),在您的情况下JobQuoteID
应该是int?
类型而不是{ {1}}
答案 1 :(得分:10)
编译器告诉您j.job_quote.JobQuoteID
的类型为int
。 int
不能为null,因为它是不可为空的值类型。无法在不可为空的类型上调用??
运算符。
答案 2 :(得分:4)
这是null-coalescing运算符,它只适用于可空类型,或者说左手边必须是可空类型(我的语言可能有错,但当我说可空时我的意思是所有Nullable<T>
'和参考类型)。如果您使用int?
代替int
,那么它可以正常运行。运算符是二进制的,并且工作原理如此; a ?? b
表示如果a
为null,则使用b作为值。您可以根据需要多次链接。所以我可以做int willNeverBeNull = a ?? b ?? c ?? 4
假设a,b和c都是可以为空的int,它将采用第一个非null值。
答案 3 :(得分:0)
由于@Servy说问题不在于JobQuoteID
,我认为错误正在发生,因为你的job_quote
对象为空,因此表达式应为:
JobQuoteID = (j.job_quote ?? new job_quote { JobQuoteID = 0 }).JobQuoteID
希望这能解决您的问题。