我正在使用C#
,.NET4.5
,EF6
(真的不应该)。
我从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;
...
我必须在这里遗漏一些明显的东西。
答案 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);
如果没有记录,则会返回0
和Net
的{{1}},如果有,则返回值。
更新 - 想出另一个:
Vat
如果legalFees.Where(o => o.Title.Contains("Severance")).Union(new ActualFee{Net = 0, Vat = 0}).First();
确实返回了某些内容,则Where()
将是First()
的值,如果不是,那么Contains("Severance")
将是First()
中的任何内容