【发布时间】:2011-04-04 19:16:39
【问题描述】:
我有以下 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));
但我得到了错误:
转换为值类型“十进制” 失败,因为物化值 一片空白。结果类型的 泛型参数或查询必须 使用可为空的类型。
我一添加这个错误就会出现:
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)
【问题讨论】:
-
@Guffa:错误是:转换为值类型“十进制”失败,因为具体化值为空。结果类型的泛型参数或查询必须使用可为空的类型。
-
这是编译错误还是运行时错误。
-
@DotnetSparrow:我清理了你的 LINQ 语句。将一堆
&&运算符更改为where运算符。现在更具可读性。 -
account.MinimumInstallment到底是什么类型? -
您是否尝试过更改为
decimal?并使用Math.Abs(minimumInstallment.HasValue ? minimumInstallment : 0)?
标签: c# .net linq linq-to-sql