2017-01-10 4 views
1

У меня есть две таблицы.Linq соединяет две таблицы и подсчитывает колонку

TableA

TableAId value value2 
1  a  b 
2  aa bb 

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 

Этом это запрос, который я пытаюсь создать, но я получаю неправильные результаты.

var query = (from a in db.TableA.AsEnumerable() 
       join b in db.TableB.AsEnumerable() 
       on a.TableAId equals b.TableAId 
       select 
       new 
       { 
        TableAId = a.TableAId, 
        value = a.value, 
        value2 = a.value2, 
        successCount = b.Status.Count(t => t.ToString() == "success"), 
        errorCount = b.Status.Count(t => t.ToString() == "failed") 
       }).ToList(); 

Любая помощь, как я могу исправить запрос, будет оценена по достоинству.

Заранее спасибо

+0

Какой результат вы получаете после запуска этого запроса? – Mostafiz

ответ

4

Вы должны сгруппировать строки что-то первым, в противном случае граф не имеет смысла.

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

Я также удалил AsEnumerable вызовов для перемещения присоединиться, группировка и подсчет в базу данных - ваш запрос объединяет все строки в память приложения перед выполнением запроса с помощью LINQ к объектам, который находится в 99,9% случаях не что ты хочешь.

+0

спасибо за объяснение, что он работает отлично –

Смежные вопросы