如何解决使用OR组合键而不是AND组合的GroupBy
我有一个特殊情况,我尝试将付款与发票匹配。我通过标准的左联接来做到这一点。
现在,我得到了发票付款清单。但是我需要将其分组以验证输入。
我需要获取连接到付款清单的发票清单。
可以多次支付一张发票,但不能支付许多发票。
如果我使用GroupBy(leftJoin => new { leftJoin.payment.Id,leftJoin.invoice?.Id })
这样的复合键组,将无法正常工作,它将返回与联接基本相同的结果。
GroupBy(leftJoin => leftJoin.payment.Id)
在一次支付许多发票的情况下将起作用。但是对于许多使用相同付款方式的发票来说,它会中断。
GroupBy(leftJoin => leftJoin.invoice?.Id)
适用于多笔付款的一张发票,但会将未匹配的付款分组(不是大笔交易),另外,多笔发票的一笔付款也会中断
我需要使用组合键,但是它必须是键之间的OR关系。不,是主意吗?
编辑:根据要求提供整个方法
public async Task MatchInvoicesWithPaymentsAsync(IEnumerable<InvoiceReadInfo> invoices,IEnumerable<PaymentReadInfo> payments)
{
var result = payments
.SelectMany(p => invoices.Where(i => p.Reference == i.Ocr).DefaultIfEmpty(),(p,i) => new { p,i })
.GroupBy(leftJoin => leftJoin.p.Id) //<--- problem goes here method GetMatchJob below takes a list of payments and a list of invoices
.Select(grp => GetMatchJob(grp.Select(info => info.p).ToList(),grp.Select(info => info.i).Where(i => i != null).Distinct().ToList()))
.Select(job => _handlers[job.MatchOutcome](job))
.Where(r => r != null)
.ToList();
await ProcessMatches(result);
}
编辑:评论中讨论后的解决方案
private class GroupByComparer : IEqualityComparer<InvoicePayment>
{
public bool Equals(InvoicePayment x,InvoicePayment y)
{
if (x.Invoice == null || y.Invoice == null) return true;
if (x.Invoice.InvoiceId == y.Invoice.InvoiceId) return true;
if (x.Payment.Id == y.Payment.Id) return true;
return false;
}
public int GetHashCode(InvoicePayment obj)
{
return 0;
}
}
解决方法
您应该能够对接受GroupBy
的{{1}}使用重载。
根据键选择器功能对序列的元素进行分组。使用比较器比较键,并使用指定的功能投影每个组的元素。
您基本上将实现以下内容:
IEqualityComparer<TKey>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。