DefaultIfEmpty 返回 null

DefaultIfEmpty returning null

我正在与 C#.NET4.5EF6 合作(真的不重要)。

我从数据库中选择一些值然后 .ToList() 它们然后添加 DefaultIfEmpty(new ActualFee{Net = 0, Vat = 0}) 如果不存在,我得到 null

public static ConveyancingSummaryVm ToConveyancingSummaryVm(this Tuple<IEnumerable<ActualFee>, ConveyancingAnswer, Customer> conveyancePricingAnswersAndCustomer)
        {
            var purchaseFees = conveyancePricingAnswersAndCustomer.Item1.Where(o => o.ConveyancingSaleType == "Purchase").ToList();

            if (purchaseFees.Any())
            {
                var discount = purchaseFees.DefaultIfEmpty(new ActualFee{Net = 0, Vat = 0}).SingleOrDefault(o => o.Title.Contains("Discount")); 

                conveyancingSummaryVm.IsPurchaseFreehold = conveyancePricingAnswersAndCustomer.Item2.PropertyBoughtIsFreehold;
...

我肯定遗漏了一些明显的东西。

在这种情况下,DefaultIfEmpty 无法变为 return null。当没有元素时,它 return 是一个 ActualFee 实例并且 Title 不包含 Discount。所以这就是为什么 SingleOrDefault returns null.

so you are saying that DefaultIfEmpty does not work for SingleOrDefault?

不,DefaultIfEmpty 有效,return 是预期值。然后SingleOrDefaultDefaultIfEmpty和return的return值上运行null因为序列中没有元素满足你的情况。

您可以使用空合并运算符来获得您想要的行为:

var discount = purchaseFees.FirstOrDefault(o => o.Title.Contains("Discount")) 
              ?? new ActualFee{Net = 0, Vat = 0};

SingleOrDefault 一定已经返回 null。如果 DefaultIfEmpty 返回了 null,它会返回 Object reference not set to an instance of an object。请在不链接的情况下重写该语句。

此处为 OP:找到了另一种解决方法。

如果您愿意 'sacrifice' 检查它是否是单个记录,而不是使用 Single(),您可以使用 Where()Sum() 组合。

我知道总有一个或零个遣散费。

示例:

var feeValue = legalFees.Where(o => o.Title.Contains("Severance"));
premiumDetails.LegalFeeNet = feeValue.Sum(o => o.Net);
premiumDetails.LegalFeeVat = feeValue.Sum(o => o.Vat);

如果 returns 0 对于 NetVat 没有记录并且如果有 - returns 值。

更新 - 想出另一个:

legalFees.Where(o => o.Title.Contains("Severance")).Union(new ActualFee{Net = 0, Vat = 0}).First();

如果 Where() 做了 return 某事,那么 First() 将是 Contains("Severance") 的值,如果没有 - 那么 First() 将是任何值在 Union().