Самый быстрый способ получить одну запись с SubSonic
Вопрос
Я новичок в SubSonic и Linq Stuff и пытаюсь найти самый короткий и оптимальный способ получения одной записи.
Какой другой способ быстрее и требует меньше кода для записи, чем этот, чтобы получить одну запись?
User user2 = DB.Select().From(User.Schema)
.Where(User.PasswordColumn).IsEqualTo(password)
.And(User.SINumberColumn).IsEqualTo(siNumber)
.ExecuteSingle<User>();
Я использовал инструмент AntsProfiler для проверки, и это занимает в среднем 29,12 мс времени процессора - проверено более чем за десять прогонов
Где это займет еще больше времени
UserController uc = new UserController();
Query query = new Query("User");
query.WHERE(User.Columns.Password, password);
query.WHERE(User.Columns.SINumber, siNumber);
User user = uc.FetchByQuery(query).First<User>();
Только последняя строка занимает 256,08 мс процессорного времени, а UserController - 66,86 мс.
Есть предложения?
Решение
IIRC, объект Query свободно .. т.е.
query.WHERE(User.Columns.Password, password);
query.WHERE(User.Columns.SINumber, siNumber);
Должно читаться как:
query = query.WHERE(User.Columns.Password, password);
query = query.WHERE(User.Columns.SINumber, siNumber);
Из-за этого может быть учтено увеличенное время в ваших тестах (вы запрашиваете все элементы пользователя, а затем получаете первый).
Другие советы
«Узкое место» будет выполнен сгенерированный запрос, а не SubSonic, генерирующий его или возвращающий результат. Если какой-то конкретный запрос медленный, вы должны изучить возможность использования функций индексации вашего поставщика базы данных для его оптимизации.
Во втором случае я предполагаю, что дополнительное время выполнения является чрезмерным для LINQ, чтобы вернуть первый элемент из коллекции.
Таким образом, мой ответ будет следующим: первый способ - это лучший способ сделать это, и если 29 мс неприемлемо (что для вызова БД, я не думаю, что это неразумно), добавьте несколько индексов в свой БД для ускорения поиска.
Я думаю, что Джон прав на деньги. Если вы действительно хотите протестировать SubSonic, чтобы увидеть, сколько времени требуется, вам нужно проверить, сколько времени требуется Subonic для создания оператора SQL, а не сколько нужно SubSonic для создания оператора SQL и сколько времени потребуется вашей БД для возврата результатов. в то же время (вам необходимо изолировать свои тесты).
Возможно, вам следует проверить, сколько времени потребуется, чтобы получить результаты с помощью обычной SQLCommand Regular, передать ей ваше соединение и параметры и посмотреть, сколько времени это займет, чтобы у вас было сравнение.