Как мне объединить два запроса count из одной таблицы?

#c# #linq #join

#c# #linq #Присоединиться

Вопрос:

Первый запрос :

 Id | UserId   |  projectId   |date   | Status
1  | 1        |  1           | 2020  | PENDDING
2  | 1        |  2           | 2020  | DONE
3  | 2        |  1           | 2020  | PENDDING
 

И что я пробовал два запроса :
первый собирается получить всю пользовательскую работу с X project, например id = 1

 var FirstQery = context.table1.where (C => C.ProjectId == 1).count();
 

Второй запрос состоит в том, чтобы получить количество пользователей со статусом project x «готово»

 var SecondQery = context.table1.where (C => C.ProjectId == 1 amp;amp; C.Status == "DONE").count();
 

Я хочу, чтобы возвращаемый объект имел только два значения: countNumberUserWithXProject
и countnumberuserbyxprojectthavexstatus

Комментарии:

1. Самый простой способ : var obj = new { countNumberUserWithXProject = FirstQery, countNumberUserByXProjectHaveXStatus = SecondQery };

2. да, я хочу сделать это в одном запросе? но я не знаю, как

Ответ №1:

Это известный подход с поддельной группировкой.

 var query = 
   from t in context.table1
   where t.ProjectId == 1
   group t by 1 into g
   select new 
   {
      Count = g.Count(),
      DoneCount = g.Sum(x => x.Status == "DONE" ? 1 : 0)
   }

var result = query.FirstOrDefault();
 

Ответ №2:

Как насчет возврата анонимного объекта (или, если вам это больше нравится, типизированного объекта, такого как int[] ).

 return new {count1 = FirstQery , count2 = SecondQery };
 

(Вернуть или назначить, например, var result = new {count1 ….} и т. Д

Вы также можете заменить FirstQuery и SecondQuery непосредственно запросом Linq.

Комментарии:

1. спасибо за ответ, да, это то, что я хочу, я хочу сделать это с запросом Linq в одном запросе? но я не знаю, как

2. @resstel Выполнение того, что вы просите, возможно, я думаю, но это не дает никаких преимуществ с точки зрения производительности и делает ваш код менее читаемым. Нехорошо. Оставьте это так, если я могу дать вам этот совет.