如何获取已结算执行的发票ID

本文关键字:执行 ID 何获取 获取 | 更新日期: 2023-09-27 18:20:03

假设我有一个表,其中包含这样的名称执行:

InvoiceID------ExecutionID-------IsSettled
123-----1-----0
123-----2-----1
345-----3-----1
345-----4-----1
567-----5-----0
567-----6-----0

我的问题:

仅检索InvoiceID的查询是什么,其中它的所有Executions的IsSettled=1。?我的意思是查询的结果应该是这样的:

345-----3-----1
345-----4-----1

我想执行任何带有isSettled flog=0执行的发票,在我的问题中,你会发现invoicieID=123有两个执行,一个带有isSettled标志=0,另一个带有isSettled标志=1的执行,所以我不想把这个发票包括在我的结果集中,因为它有一个带有isSetled标志=0 的执行

如果有人知道如果我有一个执行对象,我怎么能用Linq得到同样的结果。

查询可以是SQL或LINQ

感谢

如何获取已结算执行的发票ID

列出未结算的发票Id:

var notNeeded = ExecutionObject.Where(e => e.IsSettled == 0).Select(s => s.InvoiceId).ToList();

然后过滤已结算的发票,并确保发票id在未结算列表中。

var invoices = ExecutionObject.Where(e => e.IsSettled == 1 && !notNeeded.Contains(e.InvoiceId)).ToList();

查询可以是SQL或LINQ

Query

select * from Executions 
where InvoiceID in 
(
select InvoiceID from Executions 
group by InvoiceID
having min(Issettled)=1
)

SQL FIDDLE

考虑一下:

var invoices = (from execution in ExecutionObject
            where execution.IsSettled == 1
            && !ExecutionObject.Where(x=>x.IsSettled == 0).Select(y=>y.InvoiceID).Contains(execution.InvoiceID)
            select execution.InvoiceID).Distinct().ToList();

我还没有测试过它,但我们的想法是,首先通过IsSettled==1进行筛选,然后删除任何有IsSettled=0记录的记录。

在linq中,它可以是如下简单的东西:执行。其中(e=>e.IsSettled==1)

在理解了这个问题并在LinqPad中尝试后,以下Linq查询将获得您需要的内容:

Executions.GroupBy(e => e.InvoiceId)
          .Where(g => g.All(e => e.IsSettled == true))
          .SelectMany(g => g)

linq脚本在这里可用:http://share.linqpad.net/fawl6l.linq

如果这是一个linq查询(您还没有告诉我们),那么您可以使用:-

var settled = executions.GroupBy(id => id.invoiceid).Where(inv => inv.All(s => s.issettled)).Select(x => x).ToList();

我认为这里的关键是你想要没有结算=0的发票?

select distinct InvoiceID 
from executions
where invoiceID <> ALL(select invoice_id from executions where is_settled = 0)

或在linq 中

var q = from i in ctx.Invoices
        where ctx.Invoices.All(x => is_settled == 1 || x.invoice_id != i.invoice_id)
        select i.invoice_id;
var result = q.Distinct();