Это лучше / быстрее вернуть счет, чем вернуть объект? переполнение стека! - PullRequest
0 голосов
/ 29 декабря 2010

Я создаю хранилище в EF4. Для одного из методов пароль и имя пользователя используются для проверки пользователя. Метод возвращает количество пользователей, поэтому 0 означает, что они не существуют, а 1 - что они существуют. Будет ли это иметь большое значение, если я просто верну объект пользователя и проверил его на ноль?

Ответы [ 5 ]

1 голос
/ 29 декабря 2010

хорошо, вариант с Any будет лучше, потому что EF имеет высокую стоимость материализации и отслеживания изменений для объекта, и если этот объект имеет много свойств, вам определенно следует рассмотреть возможность использования Any.

1 голос
/ 29 декабря 2010

Технически наиболее эффективным способом, вероятно, будет использование метода расширения Any(). Если вы возвращаете объект, есть стоимость заполнения этого объекта. Если вы возвращаете счетчик, то стоит пройти каждую запись (после применения условия where) и подсчитать их. Any() должен использовать Exists в sql, и, следовательно, SQL-сервер может остановиться, как только найдет первую запись.

В конечном счете, я согласен с другими, это не то место, где вы хотите начать оптимизацию сразу. Дональд Кнут, вероятно, имеет лучшую цитату по этому поводу: «Мы должны забыть о малой эффективности, скажем, в 97% случаев: преждевременная оптимизация - корень всего зла».

Например, допустим, у вас есть этот метод, возвращающий bool, и вы используете метод Any(). Позже в запросе вам может потребоваться вытащить объект пользователя из базы данных (это может быть чем-то, что вы в конечном итоге делаете много). Теперь, рано оптимизировав, вы фактически увеличили количество обращений к базе данных.

НТН

0 голосов
/ 29 декабря 2010

Хоки, если хочешь знать правду. Оба метода будут настолько незначительными, что не имеет значения, какой из них вы выберете. Выберите тот метод, который сделает ваш код легче для понимания и чтения. Часто люди беспокоятся о производительности во всех неправильных местах.

Я согласен с Арменом, верни объект и проверь на ноль. Очень просто и легко понять, что происходит.

0 голосов
/ 29 декабря 2010

Если вам не нужны какие-либо данные из таблицы 'user' после того, как вы проверите, что существует действительная комбинация user / password, тогда любой из методов будет работать (и производительность не будет иметь значения).

С другой стороны, если после того, как вы подтвердите действительное имя пользователя / пароль, вы планируете сделать второй вызов для получения сведений о пользователе, а затем явно вернуть объект в первую очередь (и проверить на нулевое значение для проверки существования)На мой взгляд, это более эффективная стратегия.

0 голосов
/ 29 декабря 2010

Второй вариант будет лучше - с точки зрения дизайна.С точки зрения микроэффективности это не должно иметь значения

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