1 | ||||||||||||||||
Получение юзера. FindByIdAsync или SingleOrDefaultAsync20.07.2018, 10:01. Показов 1591. Ответов 14
Добрый день!
Есть два способа получения юзера по идентификатору:
0
|
20.07.2018, 10:01 | |
Ответы с готовыми решениями:
14
Получение ID / LOGIN юзера и отправка в бд Насколько точно скрипт в примере определит IP адрес юзера, агент юзера? Загрузка изображения для профиля юзера в одном контроллере с загрузкой данных юзера Как добавить в DirectoryEdit1.Text путь к папке юзера, если имя юзера кириллицей? |
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
20.07.2018, 10:45 | 2 |
Serg34, вы могли бы сами замерять)
Очень странно, что у вас есть два пути получения пользователя. Если есть специальный сервис для работы с юзерами, то нужно работать через него, а не лезть в базу напрямую (вопрос здравого смысла, а не производительности). А разница из этих двух подходов не очевидна, ибо не известно, что происходит в FindByIdAsync .Добавлено через 6 минут Но по-хорошему, разницы не должно быть. В методе FindByIdAsync может быть какая-то дополнительная логика или кеширование, но даже в этом случае, разница будет крошечно (если вообще будет заметна).А вот корректность - вопрос уже другой. Если в FindByIdAsync действительно предусмотрена некая логика, то ходить мимо неё вы просто не имеете права.
1
|
20.07.2018, 10:57 [ТС] | 3 | |||||
Да, но это будет всего лишь один замер))
Я если честно ожидал ответа вроде "Все зависит от ситуации. В одних случаях нужно так, в других так" _userManager используется как минимум для получения активного пользователя:
Да, думаю, надо FindByIdAsync использовать.
0
|
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
20.07.2018, 11:02 | 4 |
Заверните вызов метода в цикл с парой тысяч итераций и замеров станет больше.
Добавлено через 38 секунд А второй способ, принимающий ID пользователя, такой возможности не даёт?)
0
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
20.07.2018, 11:05 | 5 |
Главное различие в том, что при использовании первого варианта запрос к базе будет произведен только в том случае, если в контексте уже не закэширован объект с эти Id (был загружен ранее).
Во втором случае запрос к базе будет производиться в любом случае, то есть всегда будет получена свежая информация в рамках текущей транзакции. P.S. Я предполагаю, что UserManager в кишках использует метод Find.
2
|
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
20.07.2018, 11:09 | 6 |
1
|
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
|
|
20.07.2018, 11:12 | 7 |
Верно, но у ТСа контекст передаетя в конструктор контроллера и хранится в поле класса.
Подозреваю, что он может быть использован многократно за время жизни контроллера.
1
|
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
20.07.2018, 11:25 | 9 |
По-хорошему, нет. Один запрос - один вызов метода.
Кеш объектов хранится внутри контекста. Контекст создаётся на каждый запрос заново. Когда заканчивается обработка запроса.
1
|
20.07.2018, 16:22 [ТС] | 10 |
Думаю, это будет интересно: у меня получилось примерно в тысячу раз разница:
Пробовал еще при помощи профилировщика производительности мерять, но он явно врал: 8 против 1500 мс, и второй способ явно больше полутора секунд длился. Или я что не так замерил...
0
|
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
20.07.2018, 16:31 | 11 |
Serg34, значит метод FindByIdAsync кеширует запись и в базу ходит только один раз. Ещё учитывайте, что во втором случае создаётся делегат с лямбдой на каждой итерации, что тоже даёт некий оверхед накапливающийся с каждой итерацией.
Я рекомендую на париться замерами этих двух способов ибо между ними не будет разницы ровно никакой в реальной работе. Контекст будет создаваться заново на каждый запрос, соответственно кеш контекста бесполезен, а на создание делегата с лямбдой оходят микросекунды. Если вы испытываете проблемы с производительностью, то совершенно не там ищете причину.
0
|
20.07.2018, 16:51 [ТС] | 12 |
Usaga, Да, проблемы с производительностью, наверно, больше связаны с кривыми руками.
А сейчас я в общеобразовательных целях все это исследую. Про профилировщик было странно - почему он такие данные выдавал и можно ли ему верить...
0
|
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
20.07.2018, 16:55 | 13 |
Serg34, смотря как и что вы им замеряли... Если речь о времени затрачиваемы CPU на ваше приложение, то имейте в виду, что операции ввода-вывода (сеть, диски, работа с железом) в показания профилировщика не попадают, ибо в это время ваше приложение ждёт и ничего не делает.
А вы уже наблюдаете сумму этих задержек: работа CPU + ожидание данных от СУБД.
0
|
20.07.2018, 17:05 [ТС] | 14 |
Usaga, перепутал: не профилировщик производительности, а сообщение справа от кода во время отладки.
Насколько я понимаю, оно показывает именно время работы, включая всё, даже остановку выполнения.
0
|
12079 / 8388 / 1281
Регистрация: 21.01.2016
Сообщений: 31,601
|
|
20.07.2018, 17:09 | 15 |
Serg34, да, эта штука просто замеряет время выполнения, не различая на что оно ушло.
0
|
20.07.2018, 17:09 | |
20.07.2018, 17:09 | |
Помогаю со студенческими работами здесь
15
проблема Акцесс или юзера? Что лучше для юзера i7 3770 или Intel Xeon E5 1650? Работа с процессами или активными окнами (получение окна или хэндла) Получение или изменение SteamID Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |