首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DefaultIfEmpty返回空

DefaultIfEmpty返回空
EN

Stack Overflow用户
提问于 2015-02-03 11:44:03
回答 3查看 5.2K关注 0票数 3

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

我从db中选择一些值,然后.ToList()它们,然后在不存在的情况下添加DefaultIfEmpty(new ActualFee{Net = 0, Vat = 0}),然后得到null

代码语言:javascript
复制
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;
...

我一定是漏掉了一些显而易见的东西。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-02-03 11:48:43

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

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

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

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

代码语言:javascript
复制
var discount = purchaseFees.FirstOrDefault(o => o.Title.Contains("Discount")) 
              ?? new ActualFee{Net = 0, Vat = 0};
票数 4
EN

Stack Overflow用户

发布于 2015-02-03 11:51:21

SingleOrDefault一定是把null还给我了。如果DefaultIfEmpty返回了null,它就会返回一个Object reference not set to an instance of an object。请重写这份声明而不加链接。

票数 2
EN

Stack Overflow用户

发布于 2015-02-10 10:38:23

在这里:想出了另一个解决办法。

与其使用Single(),如果您愿意“牺牲”检查它成为单一记录,您可以做的是使用Where()Sum()组合。

我知道总有一个或零个。

示例:

代码语言:javascript
复制
var feeValue = legalFees.Where(o => o.Title.Contains("Severance"));
premiumDetails.LegalFeeNet = feeValue.Sum(o => o.Net);
premiumDetails.LegalFeeVat = feeValue.Sum(o => o.Vat);

如果没有记录,则返回0用于NetVat,如果有-返回值。

更新-发现了另一个:

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

如果Where()确实返回了什么,那么First()将是Contains("Severance")的值,如果它不返回,那么First()将是Union()中的任何值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28298087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档