#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 Выполнение того, что вы просите, возможно, я думаю, но это не дает никаких преимуществ с точки зрения производительности и делает ваш код менее читаемым. Нехорошо. Оставьте это так, если я могу дать вам этот совет.