DefaultIfEmpty 返回 null
DefaultIfEmpty returning null
我正在与 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;
...
我肯定遗漏了一些明显的东西。
在这种情况下,DefaultIfEmpty
无法变为 return null。当没有元素时,它 return 是一个 ActualFee
实例并且 Title
不包含 Discount
。所以这就是为什么 SingleOrDefault
returns null
.
so you are saying that DefaultIfEmpty does not work for SingleOrDefault?
不,DefaultIfEmpty
有效,return 是预期值。然后SingleOrDefault
在DefaultIfEmpty
和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
对于 Net
和 Vat
没有记录并且如果有 - returns 值。
更新 - 想出另一个:
legalFees.Where(o => o.Title.Contains("Severance")).Union(new ActualFee{Net = 0, Vat = 0}).First();
如果 Where()
做了 return 某事,那么 First()
将是 Contains("Severance")
的值,如果没有 - 那么 First()
将是任何值在 Union()
.
我正在与 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;
...
我肯定遗漏了一些明显的东西。
在这种情况下,DefaultIfEmpty
无法变为 return null。当没有元素时,它 return 是一个 ActualFee
实例并且 Title
不包含 Discount
。所以这就是为什么 SingleOrDefault
returns null
.
so you are saying that DefaultIfEmpty does not work for SingleOrDefault?
不,DefaultIfEmpty
有效,return 是预期值。然后SingleOrDefault
在DefaultIfEmpty
和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
对于 Net
和 Vat
没有记录并且如果有 - returns 值。
更新 - 想出另一个:
legalFees.Where(o => o.Title.Contains("Severance")).Union(new ActualFee{Net = 0, Vat = 0}).First();
如果 Where()
做了 return 某事,那么 First()
将是 Contains("Severance")
的值,如果没有 - 那么 First()
将是任何值在 Union()
.