Какой самый быстрый способ сгруппировать и получить МАКС что-то в C #? - PullRequest
0 голосов
/ 15 февраля 2011

Я вставляю новые элементы в базу данных, где первичный ключ представляет собой штрих-код в сочетании с номером версии. Если я просто вставляю их и использую фальшивый номер версии, для маленького файла у меня уходит 9 минут, однако, если я использую предоставленную мною инструкцию linq для вычисления номера версии, в чистой базе данных это значение увеличивается до 30 минут, и это становится немного хуже если база данных предварительно заполнена. Есть ли лучший способ сделать номер версии?

var results = from p in dataContext.GetTable<mailsortEntity>()
                              where p.Barcode == barcode
                              group p by p.Barcode into g
                              select new { currentVersionNo = g.Max(p => p.VersionNo) };

1 Ответ

5 голосов
/ 15 февраля 2011

Учитывая, что вы уже ограничиваете штрих-код, ваша группировка бессмысленна. В основном ваш запрос может быть упрощен до:

var version = dataContext.GetTable<mailSortEntity>()
                         .Where(p => p.Barcode == barcode)
                         .Max(p => p.VersionNo);

РЕДАКТИРОВАТЬ: Если вам нужно разрешить ситуации, когда штрих-код вообще отсутствует в базе данных, вы можете использовать обнуляемую форму:

var version = dataContext.GetTable<mailSortEntity>()
                         .Where(p => p.Barcode == barcode)
                         .Max(p => (int?) p.VersionNo);

(при условии p.VersionNo равно int).

Это сделает version Nullable<int> с нулевым значением, если штрих-код отсутствует в базе данных.

Теперь без предложения where более логично иметь группировку - но вам нужна только часть версии, поэтому вы можете изменить группировку:

var results = from p in dataContext.GetTable<mailsortEntity>()
              group p.VersionNo by p.Barcode into g
              select g.Max();

С другой стороны, он не скажет, какой номер версии является максимальным для какого штрих-кода, поэтому вы можете захотеть:

var results = from p in dataContext.GetTable<mailsortEntity>()
              group p.VersionNo by p.Barcode into g
              select new { Barcode = g.Key, CurrentVersion = g.Max() };

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

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