DefaultIfEmpty 返回 null

Mat*_*ius 3 .net c# linq entity-framework

我正在与C#, .NET4.5, EF6(实际上应该不重要)。

我从数据库中选择一些值,然后.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;
...
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我一定在这里遗漏了一些明显的东西。

Sel*_*enç 5

在这种情况下没有办法DefaultIfEmpty返回 null。当没有元素时,它返回一个ActualFee实例并且Title不包含Discount。这就是SingleOrDefault返回的原因null

所以你是说 DefaultIfEmpty 不适用于 SingleOrDefault ?

不,DefaultIfEmpty可以工作并返回预期值。然后SingleOrDefault运行返回值DefaultIfEmpty并返回null,因为序列中没有满足您的条件的元素。

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

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