Im LINQPad mit meinem EF Abfrage zu testen, und ich kann nicht mein Endergebnis zu erhalten, sind ein paar zusätzliche Spalten scheinen die Summen eines Feldes darstellen, die auf unterschiedlichen BedingungenWie mehrere Summen erhalten, die Unterabfragen sind
StorePaymentInvoices Tabelle enthält einen FK über CustomerStatementBatchPayments. Also muss ich das CustomerStatementBatchPayment.net Feld summieren, wenn es einen entsprechenden Wert in StorePaymentInvoices gibt
Das Erhalten der Summen erweist sich als ein echtes Durcheinander. Irgendwelche Vorschläge? Manchmal, was in einer Anweisung schwer zu tun ist, wird in mehreren Schritten einfacher erledigt.
var retval = (
from a in CustomerStatementBatches
join b in CustomerStatementBatchPayments on a.ID equals b.CustomerStatementBatchID into grp1
from c in grp1
where a.CustomerStatementID == StatementId
group c by c.CustomerStatementBatchID into grp2
from e in grp2
select new {
StatementId = e.CustomerStatementBatch.CustomerStatementID,
BatchId = e.CustomerStatementBatchID,
Applied = CustomerStatementBatchPayments.Where(csbp => !StorePaymentInvoices.Select (pi => pi.CustomerStatementBatchPaymentID).ToList().Contains(e.ID)).Sum (csbp => csbp.Net)
}
).ToList();
retval.Dump();
[UPDATE 1]
Dies ist, was Ive die „bedingte“ Summenwerte zu erhalten getan, und ich scheinen immer die richtigen Zahlen werden. Das resultierende SQL, das es generiert, ist ein bisschen hässlich, wird aber in < 1 Sekunde ausgeführt.
var retval1 = (
from a in CustomerStatementBatches
join b in CustomerStatementBatchPayments on a.ID equals b.CustomerStatementBatchID into grp1
from c in grp1
where a.CustomerStatementID == StatementId
group c by new { a.CustomerStatementID, c.CustomerStatementBatchID} into grp2
from e in grp2.Distinct()
select new {
StatementId = e.CustomerStatementBatch.CustomerStatementID,
BatchId = e.CustomerStatementBatchID
}
).ToList()
.Distinct()
.Select(a => new
{
StatementId = a.StatementId,
BatchId = a.BatchId,
AppliedTotal = (from b in CustomerStatementBatchPayments.Where(r => r.CustomerStatementBatchID == a.BatchId)
join c in StorePaymentInvoices on b.ID equals c.CustomerStatementBatchPaymentID
group b by b.CustomerStatementBatchID into g1
from d in g1
select new{ Total = (decimal?)d.Net}).DefaultIfEmpty().Sum (at => (decimal?)at.Total) ?? 0.0m,
Unappliedtotal = (from b in CustomerStatementBatchPayments.Where(r => r.CustomerStatementBatchID == a.BatchId)
.Where(s => !StorePaymentInvoices.Any (pi => pi.CustomerStatementBatchPaymentID == s.ID))
select new{ Total = (decimal?)b.Net}).DefaultIfEmpty().Sum (at => (decimal?)at.Total) ?? 0.0m
})
.ToList();
wieder die Original-Beitrag ansehen. Ich versuche, die Summe für die Datensätze zu erstellen, bei denen in StorePaymentInvoices keine FK-Übereinstimmung vorhanden ist. Mit anderen Worten, ich muss eine bedingte Summe machen. Mit TSQL wäre es eine Unterabfrage, die "nicht existiert" verwendet. Brauchen Sie auch ein zweites Feld in den Ergebnissen, die "wo in tsql existiert" sein würde. Hoffnung, die Sinn macht. Ich werde sehen, ob ich das in kleinere Aussagen aufteilen kann, aber ich bin neugierig, ob ich es in einem machen kann. – bitshift
Schreiben Sie diesen Zustand in 'wo clauase'? lass es mich wissen, es hat funktioniert – NEER
Ich habe ein Update zum ursprünglichen Beitrag hinzugefügt. Ich denke, ich habe es nach einer Menge Kummer bekommen, aber ich wusste, dass es chaotisch werden würde. – bitshift