2017-01-11 6 views
0

У меня есть две таблицы.Linq join missing columns

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 

Я пытаюсь создать список как

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

Это запрос, я пишу

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") 
} 

Из приведенного выше запроса я получаю следующий результат

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

Проблема заключается в том, что я пропускаю те записи, где нет Хида записи в таблице В. в этом случае мне не хватает TableAId: 3 записи

Как включить те записи, которые только в таблице а и не имеют ни одной записи в таблице B.

Любые предложения будут оценены. благодарит заранее.

ответ

2

Используйте группу присоединиться, чтобы получить записи из TableB, которые связаны запись с TABLEA (объединения таблиц по TableAId). А затем просто выбрать счет из группы TableB записей:

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 
}; 

Выход:

[ 
    { 
    "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

Вам понадобится linq equivalent of a left outer join. (Еще один хороший пример here)

так, например:

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") 
} 

Вы можете добавить что-то дополнительно в выберите новый {...} части для обработки нулевых значений для successcount/ERRORCOUNT, я Я не уверен, не там, где я могу проверить это прямо сейчас.

1

Вы должны выполнить левое соединение и использовать 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") 
}