2017-07-03 4 views
-1

Ich habe drei Tabellen:LEFT JOIN drei Tabellen und SUM in LINQ

  • Produkte gekauft (RecordEntered als A)
  • Produkte in dem Land (SoldInCountry als B) verkauft
  • Produkte außerhalb des Landes verkauft (SoldOutCountry als C)

enter image description here

Jeder Datensatz in A können sein:

  • eingegeben und noch nicht
  • eingegeben und verkauft nur in dem Land verkauft
  • eingegeben und verkauft nur aus dem Land
  • eingegeben und verkauft im Land und auch außerhalb des Landes

ich begann, die Stücke in Tabelle B Gruppierung wie so:

SELECT   
A.IdRecord, A.Qty, sum(isnull(B.Qty,0)) AS Expr1 
FROM    
RecordEntered AS A 
LEFT OUTER JOIN 
SoldInCountry AS B ON A.IdRecord = B.IdRecord 
group by A.IdRecord, A.Qty 

Aber ich weiß nicht weiter.

Ich möchte eine Abfrage, um mir zu zeigen, wie viele Stücke ich noch auf Lager habe. So:

A.Qty - (SUM(ISNULL(B.Qty, 0)) + SUM(ISNULL(C.Qty, 0))) 

ich ein Beispiel in SQL geschrieben, aber das Ziel ist LINQ:

from a in _ctx..... 
    where ..... 
    select... 

dank

Antwort

1

Es ist nicht einfach, eine vollständige äußere Verknüpfung in LINQ zu tun (siehe meine Antwort hier: https://stackoverflow.com/a/43669055/2557128), aber Sie brauchen nicht, dass dies zu lösen:

var numInStock = from item in RecordEntered 
      select new { 
       item.Code, 
       Qty = item.Qty - (from sic in SoldInCountry where sic.IdRecord == item.IdRecord select sic.Qty).SingleOrDefault() - 
      (from soc in SoldOutCountry where soc.IdRecord == item.IdRecord select soc.Qty).SingleOrDefault() 
      }; 

Ich nahm es nur eine wäre verkauft Aufzeichnung jeder Art für ein Element, wenn es mehr als eine sein könnte, müssen Sie Sum die passenden Datensätze:

var numInStock = from item in RecordEntered 
      select new { 
       item.Code, 
       Qty = item.Qty - (from sic in SoldInCountry where sic.IdRecord == item.IdRecord select sic.Qty).DefaultIfEmpty().Sum() - 
      (from soc in SoldOutCountry where soc.IdRecord == item.IdRecord select soc.Qty).DefaultIfEmpty().Sum() 
      }; 
+0

WOW .. der zweite Code ist perfekt .. tks – user2080358