Попытка оптимизировать запрос linq - PullRequest
4 голосов
/ 07 мая 2019

Я пытаюсь создать запрос linq для выполнения следующих действий:

  1. Получить счетчик всех пользователей
  2. Получить счетчик всех официальных пользователей
  3. Подсчитать количество всех неофициальных пользователей

Пока я придумал следующее:

var query = context.Users;

List<Users> users = query.ToList();
int totalUsers = users.Count;
int officialUsers = users.Where(s => s.IsOfficialUser).ToList().Count;
int nonOfficialUsers = users.Where(s => !s.IsOfficialUser).ToList().Count;

Я не уверен, насколько сильно повлияет на производительность мой звонок.ToList() много раз.Так что я надеялся, что есть способ оптимизировать запрос или я на правильном пути?

Ответы [ 3 ]

3 голосов
/ 07 мая 2019

Использование .ToList в материализованном списке повлияет только на объем необходимой памяти. Хотя технически это может сказаться на производительности, маловероятно, если у вас не будет миллионов пользователей; в этом случае, честно говоря, в любом случае, возможно, вам будет доступна оперативная память сервера.

.ToList определенно не требуется, хотя. Все, что вам нужно сделать, это подсчитать разницу здесь, чтобы вы могли пропустить ToList и Where (поскольку Count принимает Func)

int officialUsers = users.Count(s => s.IsOfficialUser);
int nonOfficialUsers = users.Count(s => !s.IsOfficialUser);
2 голосов
/ 07 мая 2019

Одна простая оптимизация:

int totalUsers = users.Count;
int officialUsers = users.Where(s => s.IsOfficialUser).ToList().Count;
int nonOfficialUsers = totalUsers - officialUsers;

Как только эта строка кода запускается List<Users> users = query.ToList();, запрос выполняется немедленно.

После этого вам не понадобится ToList(), см. Здесь:

int totalUsers = users.Count;
int officialUsers = users.Count(s => s.IsOfficialUser);
int nonOfficialUsers = totalUsers - officialUsers;
0 голосов
/ 07 мая 2019

А как насчет этого метода?

  • Группируйте свою коллекцию на основе IsOfficialUser, что дает вам две коллекции nonOfficialUsers и officialUsers, верно?
  • Получите счетэти коллекции отдельно, чтобы получить соответствующие подсчеты
  • Сумма этих подсчетов будет полной правильной?

Теперь попробуйте этот пример :

 var groupedUsers = users.GroupBy(x => x.IsOfficialUser).ToDictionary(g =>  g.Key, g=>g.Count());
 int officialUsers = groupedUsers[true];
 int nonOfficialUsers = groupedUsers[false];
 int totalUsers = nonOfficialUsers + officialUsers;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...