LINQ to Nhibernate производительность - PullRequest
3 голосов
/ 16 марта 2012

Я использую комбинацию NHibernate и LINQ, чтобы попытаться выполнить запросы, но я обеспокоен тем, что следующий запрос возвращает каждую строку пользователя из БД, что обеспечивает большую задержку БД, большой сетевой трафик, большую памятьслед, а затем отфильтровывать его слишком поздно.

public bool CheckEmailAddressIsAvailable
               (string emailAddress, IDataRepository repository)
{
     var users = from user in repository.GetItems<User>()
                 where user.EmailAddress.Equals(
                     emailAddress,
                     System.StringComparison.CurrentCultureIgnoreCase)
                 select user;

     return !(users.Any());
}

DataRepository - это простая оболочка для сеанса NHibernate. Я хочу знать, что это двойная

1).создается, чтобы я мог следить за тем, что выполняется, и 2) Как я могу выполнить вышеупомянутый запрос, чтобы имитировать ниже SQL

select count(*) from [User] where EmailAddress = @emailAddress

Ответы [ 2 ]

3 голосов
/ 16 марта 2012

NHibernate использует log4net для ведения журнала, поэтому, если вы уже используете его, одним из способов было бы установить уровень ведения журнала NHibernate.SQL на DEBUG в вашем файле app.config:

<logger name="NHibernate.SQL">
  <level value="DEBUG"/>
</logger>

Как правило, как и в любом другом приложении, вы можете просто использовать SQL Profiler и некоторое время регистрировать запросы.

Что касается вашего кода LINQ, я почти уверен, что он создает SQL-запрос, подобный вашему ниже, но трудно сказать, не увидев код GetItems.

Если это кажется медленным, вам, вероятно, нужен индекс для вашего столбца EmailAddress. В SQL Profiler хорошо то, что вы можете анализировать его журналы в помощнике по настройке ядра СУБД и получать рекомендации по его улучшению.

0 голосов
/ 16 марта 2012

Что возвращает GetItems? Если он возвращает что-либо, кроме IQueryable (), то вы просто делаете LINQ to Objects (в памяти). А это означает загрузку всего набора.

Вы должны вернуть IQueryable, чтобы разрешить фильтрацию на стороне БД.

Проверьте метод расширения Query () для ISession. Это даст вам IQueryable

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