LINQ Lambda эффективность кода группы по порядку - PullRequest
4 голосов
/ 17 января 2020

У меня есть этот код, но я думаю, что он может работать быстрее, или я просто надеюсь. Но у меня есть много данных. Я хотел бы, чтобы он был настолько эффективным, насколько это возможно.

Вот код:

(Необходимо возвращать новейшие переводы слов (Язык и значение) из ресурсов, сгруппированных по ресурсам и язык на основе Expression<Func<ResourcesTranslation, bool>> ConditionExpression)

KeyValues = item.Resources
                .Where(ConditionExpression)
                .GroupBy(g => new { g.ResourceId, g.Language })                  
                .Select(m => m.OrderByDescending(o => o.Changed ?? o.Created))
                .Select( s => new KeyValues
                {
                    Language = s.FirstOrDefault().Language,
                    KeyValue = s.FirstOrDefault().Value
                }).ToList();

Ответы [ 3 ]

2 голосов
/ 17 января 2020

Поскольку вам нужен только один элемент после группировки, вы можете вернуть его прямо в предложении GroupBy, это упростит ваш код:

KeyValues = item.Resources
    .Where(ConditionExpression)
    .GroupBy(g => new { g.ResourceId, g.Language }, 
         (x, y) => new { Max = y.OrderByDescending(o => o.Changed ?? o.Created).First() })
    .Select(s => new KeyValues
    {
        Language = s.Max.Language,
        KeyValue = s.Max.Value
    })
    .ToList();
0 голосов
/ 20 января 2020

Я обнаружил, что Visual Studio переводит его в выборку, поэтому я понял, что лучшее решение для таких вещей - это создать представление. Просто дать ответ на вопрос Q для других парней.

0 голосов
/ 17 января 2020

Даже если вы можете добиться некоторой производительности, удалив первый ненужный выбор (в зависимости от объема данных, это может быть улучшение от минимального до среднего), например:

KeyValues = item.Resources
                .Where(ConditionExpression)
                .GroupBy(g => new { g.ResourceId, g.Language })                  
                .OrderByDescending(o => o.Changed.HasValue ? o.Changed : o.Created)
                .Select( s => new KeyValues
                {
                    Language = s.Language,
                    KeyValue = s.Value
                }).ToList();

В зависимости от вашего случая вы Могут:

  1. Если ваши данные находятся в базе данных, вы можете создавать улучшения базы данных, такие как добавление индексов, обновление статистики, используя подсказки et c.

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

Нет другого способа значительно улучшить ваш запрос linq. Вам нужно найти другую стратегию для достижения этой цели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...