Самый быстрый способ получить одну запись с SubSonic

StackOverflow https://stackoverflow.com/questions/818031

  •  03-07-2019
  •  | 
  •  

Вопрос

Я новичок в 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, передать ей ваше соединение и параметры и посмотреть, сколько времени это займет, чтобы у вас было сравнение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top