我关注了Linq:
var ownerRegistryId = 731752693037116688;
var excludeTypes = new[]
{
"CA00", "CA01", "CA03", "CA04", "CA02",
"PA00", "PA01", "PA02", "PA03", "PA04"
};
var maxStateChangeMonth = 4;
var excludeStatusId = 999;
var includeMortgage = new[] { "CL10", "CL11", "PL10", "PL11" };
var sum = (
from account in context.Accounts
from owner in account.AccountOwners
where owner.AccountOwnerRegistryId == ownerRegistryId
where !excludeTypes.Contains(account.AccountType)
where account.StateChangeDate == null ||
(account.StateChangeDate.Month - DateTime.Now.Month)
<= maxStateChangeMonth
where includeMortgage.Contains(account.AccountType) ||
account.AccountType.Contains("Mortgage")
where account.AccountStatusId != excludeStatusId
select account.MinimumInstallment)
.Sum(minimumInstallment => Math.Abs(minimumInstallment));
但是我收到了错误:
转换为值类型'Decimal' 失败,因为物化价值 一片空白。结果类型 泛型参数或查询必须 使用可空类型。
一旦我添加此错误就会出现:
where (includeMortgage.Contains(account.AccountType) ||
account.AccountType.Contains("Mortgage"))
如果我从上面的查询中删除它,它就可以。
查询是以下SQL的翻译:
SELECT Sum(ABS([Minimum Installment])) AS SumOfMonthlyPayments FROM tblAccount
INNER JOIN tblAccountOwner ON tblAccount.[Creditor Registry ID] = tblAccountOwner.
[Creditor Registry ID] AND tblAccount.[Account No] = tblAccountOwner.[Account No]
WHERE (tblAccountOwner.[Account Owner Registry ID] = 731752693037116688)
AND (tblAccount.[Account Type] NOT IN
('CA00', 'CA01', 'CA03', 'CA04', 'CA02', 'PA00', 'PA01', 'PA02', 'PA03', 'PA04'))
AND (DATEDIFF(mm, tblAccount.[State Change Date], GETDATE()) <=
4 OR tblAccount.[State Change Date] IS NULL AND ((tblAccount.[Account Type] IN ('CL10','CL11','PL10','PL11')) OR
tblAccount.[Account Type] LIKE 'Mortgage')) AND (tblAccount.[Account Status ID] <> 999)
答案 0 :(得分:2)
我会尝试重写查询的最后两行:
var sum = (
...
select account)
.Sum(a => Math.Abs(a.MinimumInstallment));
这就是我如何解释异常"...or the query must use a nullable type"
的这一部分。通过使用投影select account.MinimumInstallment
,您有一个不可为空的类型,即decimal
类型account.MinimumInstallment
。
不确定,只是一个猜测。
修改强>
问题可能实际上是最终作业var sum = ...
。由于您没有明确指定结果类型,因此编译器会在此处将类型推断为decimal
,因为MinimumInstallment
是十进制的。当所选记录集为空时,查询实际上可以返回null
,因此无法转换为十进制。
因此,让我们帮助编译器将查询的结果类型推断为decimal?
:
var sum = (decimal?)(from ... ) ?? 0;
(将from ...
替换为您的原始查询,或者替换我上面修改过的版本。)
修改2
好的,第一个编辑不起作用(根据另一个问题的评论)。事实上,我可以在类似的例子中重现这个问题。但以下工作在我的例子中:
var sum = (
...
select account)
.Sum(a => (decimal?)Math.Abs(a.MinimumInstallment))
.GetDefaultOrValue();
答案 1 :(得分:0)
尝试使用:
Math.Abs((十进制)(minimumInstallment.HasValue?minimumInstallment:0));
怎么样:
Math.Abs((decimal)(minimumInstallment!= null ? minimumInstallment : 0));