2016-07-22 42 views
0

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(); 

Antwort

0

Versuchen Sie, diese

from a in db.CustomerStatementBatches 
join b in db.CustomerStatementBatchPayments 
      //.Where(i => ...) 
      .GroupBy(i => i.CustomerStatementBatchesId) 
      .Select(i => new { 
           CustomerStatementBatchesId = i.Key, 
           SumOfPayments = i.Sum(t => t.Net) 
          } 
        ) 
      into tmp from b in tmp.DefaultIfEmpty() 
     on a.CustomerStatementBatchesId equals b.CustomerStatementBatchesId 
select new 
{ 
    StatementId = a.CustomerStatementId, 
    BatchId = a.CustomerStatementBatchId, 
    Applied = ((b == null) ? 0 : b.SumOfPayments) 
} 
+0

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

+0

Schreiben Sie diesen Zustand in 'wo clauase'? lass es mich wissen, es hat funktioniert – NEER

+0

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