【问题标题】:LINQ Confusion with Sum and comparisonLINQ 与 Sum 和比较的混淆
【发布时间】:2015-05-04 15:51:00
【问题描述】:

我正在尝试确定哪些发票仍有余额。我将通过实体框架查看发票,并尝试计算哪些发票的小计大于应用的付款金额。

我写了以下5个测试用例

var test1 = _invoiceRepository.Where(x => x.Subtotal > 0);
var test2 = _invoiceRepository.Where(x => x.Payments.Sum(y => y.Amount) > 0);
var test3 = _invoiceRepository.Where(x => x.Payments.Sum(y => y.Amount) < 60);
var test4 = _invoiceRepository.Where(x => x.Payments.Sum(y => y.Amount) < x.Subtotal);
var test6 = _invoiceRepository.Where(x => x.Payments.Sum(y => y.Amount) == x.Subtotal);
var test7 = _invoiceRepository.Where(x => x.Payments.Sum(y => y.Amount) != x.Subtotal);

结果返回此数量的发票

 test1: 392 
 test2: 216
 test3: 126
 test4: 0
 test6: 215
 test7: 177

测试 1 说我有小计大于 0 的发票。

测试 2 和 3 表明我已将付款应用于发票,并且我可以正确汇总它们。

测试 4 是我感到困惑的地方。我无法返回任何将总和与表中小数进行比较的记录。我已经尝试过在所有内容周围加上括号的变体,但无济于事。

建议进行测试 6 和 7,并且这些测试有效,但如果付款少于总和怎么办?或者更大(发生了什么)?

如何修改我的 LINQ 以返回有余额的发票?

提前致谢!

【问题讨论】:

  • 你确定_invoiceRepository有余额记录吗?
  • test1 确认 392 张发票中有 392 张有小计。

标签: c# linq-to-entities


【解决方案1】:

注意test4test5 是同一个表达式。

但万一这是粘贴错误,付款总和不等于小计吗?您没有考虑相等的情况。

var test6 = _invoiceRepository.Where(x => x.Payments.Sum(y => y.Amount) == x.Subtotal);

【讨论】:

  • 您对 test4test5 的看法是正确的,正在展示一些替代方案。 Test6 确实有效!但是为什么大于或小于比较不起作用呢?没有付款的情况导致 小于 不返回任何值。
  • 我已经找到了解决这个问题的方法,但我也很困惑。 var test5 = _invoiceRepository.Where(x =&gt; ! x.Payments.Any() || x.Payments.Sum(y =&gt; y.Amount) &lt; x.Subtotal).ToList();
  • 我以为你在寻找那个表达式:var test5 = _invoiceRepository.Where(x =&gt; x.Subtotal &gt;= x.Payments.Sum(y =&gt; y.Amount));(注意减号或等号)
  • 另外,在大多数情况下,当没有元素时,Linq 会抛出 Sum 的异常,但我不确定 linq to sql 是否是这种情况。你可以在这里阅读更多:stackoverflow.com/questions/17593371/…
  • 如果 Sum 中没有元素,它不会抛出异常,但在这种情况下它似乎会返回 null。然后它尝试在 null0 之间进行比较,并且记录不包含在结果中。
猜你喜欢
  • 2017-01-24
  • 2019-12-29
  • 2014-06-03
  • 2011-08-15
  • 1970-01-01
  • 2012-08-18
  • 2017-01-07
  • 1970-01-01
相关资源
最近更新 更多