DefaultIfEmpty返回null

时间:2015-02-03 11:44:04

标签: c# .net linq entity-framework

我正在使用C#.NET4.5EF6(真的不应该)。

我从db中选择一些值然后.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;
...

enter image description here

我必须在这里遗漏一些明显的东西。

3 个答案:

答案 0 :(得分:3)

在这种情况下,DefaultIfEmpty无法返回null。如果没有元素,则返回ActualFee个实例,Title不包含Discount。这就是SingleOrDefault返回null

的原因
  

所以你说DefaultIfEmpty对SingleOrDefault不起作用?

不,DefaultEmpty有效并返回预期值。然后SingleOrDefault在返回值DefaultIfEmpty上运行并返回 null ,因为没有元素在满足你条件的顺序中。

您可以使用null合并运算符来获取所需的行为:

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

答案 1 :(得分:2)

SingleOrDefault必须已退回null。如果DefaultIfEmpty已返回null,则会返回Object reference not set to an instance of an object。请不要链接重写该声明。

答案 2 :(得分:0)

OP在这里:找到另一种解决方法。

如果您愿意牺牲&#39;而不是使用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);

如果没有记录,则会返回0Net的{​​{1}},如果有,则返回值。

更新 - 想出另一个:

Vat

如果legalFees.Where(o => o.Title.Contains("Severance")).Union(new ActualFee{Net = 0, Vat = 0}).First();确实返回了某些内容,则Where()将是First()的值,如果不是,那么Contains("Severance")将是First()中的任何内容