2017-01-11 7 views
0

Ich habe zwei Tabellen.Linq beitreten fehlende Spalten

TableA

TableAId value value2 
1  a  b 
2  aa bb 
3  aaa bbb 

TableB

TableBId TableAId Status 
    1  1  success 
    2  1  success 
    3  2  failed 
    4  2  failed 

Ich versuche Liste wie

TableAId value value2 successCount errorCount 
    1  a  b  2   0 
    2  aa bb  0   2 
    3  aaa bbb  0   2 

zu erstellen Dies ist die Abfrage i

from a in db.TableA 
join b in db.TableB on a.TableAId equals b.TableAId 
group b by a into g 
select new 
{ 
    TableAId = g.Key.TableAId, 
    value = g.Key.value, 
    value2 = g.Key.value2, 
    successCount = g.Count(t => t.Status == "success"), 
    errorCount = g.Count(t => t.Status == "failed") 
} 

Aus der obigen Abfrage schreibe ich bin das folgende Ergebnis erhalten

TableAId value value2 successCount errorCount 
    1  a  b  2   0 
    2  aa bb  0   2 

Das Problem ist, dass ich die Datensätze fehle, wo es keine Hid Datensatz in Tabelle B ist in diesem Fall fehle ich TableAId: 3 Rekord

Wie die Datensätze enthalten, die nur in der Tabelle A und haben keinen Datensatz in Tabelle B

012.351.

Alle Vorschläge würden geschätzt werden. danke im voraus.

Antwort

2

Verwendungsgruppe verwenden, um auszuführen join Datensätze aus tableB zu erhalten, die verwandt sind von tableA aufzeichnen (Join-Tabellen von TableAId). Und dann wählen Sie einfach Zählung aus der Gruppe von tableB Datensätze:

from a in db.TableA 
join b in db.TableB on a.TableAId equals b.TableAId into ab 
select new { 
    a.TableAId, 
    a.value, 
    a.value2, 
    successCount = ab?.Count(t => t.Status == "success") ?? 0, 
    errorCount = ab?.Count(t => t.Status == "failed") ?? 0 
}; 

Ausgang:

[ 
    { 
    "TableAId": 1, 
    "value": "a", 
    "value2": "b", 
    "successCount": 2, 
    "errorCount": 0 
    }, 
    { 
    "TableAId": 2, 
    "value": "aa", 
    "value2": "bb", 
    "successCount": 0, 
    "errorCount": 2 
    }, 
    { 
    "TableAId": 3, 
    "value": "aaa", 
    "value2": "bbb", 
    "successCount": 0, 
    "errorCount": 0 
    } 
] 
1

Sie werden die linq equivalent of a left outer join benötigen. (Ein weiteres gutes Beispiel ist here)

so zum Beispiel:

from a in db.TableA 
join b in db.TableB on a.TableAId equals b.TableAId into c 
from d in c.DefaultIfEmpty() 
group b by a into g 
select new 
{ 
    TableAId = g.Key.TableAId, 
    value = g.Key.value, 
    value2 = g.Key.value2, 
    successCount = g.Count(t => t.Status == "success"), 
    errorCount = g.Count(t => t.Status == "failed") 
} 

Sie müssen möglicherweise etwas zusätzliche in den select new {...} Teil hinzuzufügen Nullwerte für Success/Errorcount zu handhaben, ich bin mir nicht sicher, nicht wo ich es jetzt testen kann.

1

Sie benötigen ein LEFT JOIN und into/from/DefaultIfEmpty()

from a in db.TableA 
join b in db.TableB on a.TableAId equals b.TableAId into bg 
form b in bg.DefaultIfEmpty() 
group b by a into g 
select new 
{ 
    TableAId = g.Key.TableAId, 
    value = g.Key.value, 
    value2 = g.Key.value2, 
    successCount = g.Count(t => t.Status == "success"), 
    errorCount = g.Count(t => t.Status == "failed") 
}