如何获取已结算执行的发票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:
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记录的记录。
在理解了这个问题并在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();