-1

可以说我有这样的名称执行表:

InvoiceID------ExecutionID-------IsSettled

123-----1-----0

123-----2-----1

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

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

567-----5-----0

567-----6-----0

我的问题 :

什么是仅检索所有执行都具有 IsSettled=1 的 InvoiceID 的查询?我的意思是查询的结果应该是这样的:

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

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

我想执行任何带有 isSettled flog=0 执行的发票,在我的问题中你会发现 tha invocieID=123 有 2 个执行,一个带有 IsSettled 标志 = 0 和另一个带有 IsSettled 标志 = 1 的执行,所以我不想将此发票包含在我的结果集中,因为它执行一次 isSettled 标志 =0

如果有人也知道我是否有执行对象,我如何使用 Linq 获得相同的结果。

查询可以是 SQL 或 LINQ

谢谢

4

6 回答 6

1

查询可以是 SQL 或 LINQ

Query

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

SQL 小提琴

于 2013-06-27T11:08:53.580 回答
1

列出未结算的发票 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();
于 2013-06-27T10:46:56.473 回答
0

考虑一下:

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 记录的记录。

于 2013-06-27T11:03:22.903 回答
0

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

var settled = executions.GroupBy(id => id.invoiceid).Where(inv => inv.All(s => s.issettled)).Select(x => x).ToList();
于 2013-06-27T10:44:55.043 回答
0
就像在 linq 中的以下内容一样简单: Executions.Where(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

于 2013-06-27T10:46:19.523 回答
-4

我认为这里的关键是您想要没有结算 = 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();
于 2013-06-27T11:03:43.053 回答