Использование выражения LINQ вместо NHIbernate.Criterion - PullRequest
3 голосов
/ 24 апреля 2009

Если бы я выбрал несколько строк на основе определенных критериев, я мог бы использовать ICriterion объект в NHibernate.Criterion, например:

  public List<T> GetByCriteria()
  {
  SimpleExpression newJobCriterion =
    NHibernate.Criterion.Expression.Eq("LkpStatu", statusObject);
  ICriteria criteria = Session.GetISession().CreateCriteria(typeof(T)).SetMaxResults(maxResults);
  criteria.Add(newJobCriterion );
  return criteria.List<T>();
  }

Или я могу использовать предложение LINQ для фильтрации того, что я хочу:

  public List<T> GetByCriteria_LINQ()
  {

  ICriteria criteria = Session.GetISession().CreateCriteria(typeof(T)).SetMaxResults(maxResults);

  return criteria.Where(item=>item.LkpStatu=statusObject).ToList();
  }

Я бы предпочел второй, конечно. Потому что

  1. Это дает мне сильный набор
  2. Мне не нужно изучать еще один другой синтаксис в форме NHibernate

Вопрос в том, есть ли какое-либо преимущество в производительности по сравнению с первым? Из того, что я знаю, первый будет создавать запросы SQL, поэтому он будет фильтровать данные перед передачей в память. Достаточно ли велика экономия такого рода производительности, чтобы оправдать ее использование?

Ответы [ 2 ]

3 голосов
/ 24 апреля 2009

Как обычно, это зависит. Во-первых, обратите внимание, что во втором фрагменте кода .List() отсутствует сразу после return criteria. Также обратите внимание, что вы не получите одинаковые результаты в обоих примерах. Первый делает где, а затем возвращает top maxResults, второй, однако, сначала выбирает top maxResults, а затем делает где.

Если ваш ожидаемый набор результатов является относительно небольшим, и вы, вероятно, будете использовать некоторые результаты в ленивых нагрузках, тогда на самом деле лучше выбрать второй подход. Потому что все сущности, загруженные через сеанс, останутся в его кэше первого уровня.

Обычно, однако, вы не делаете это таким образом и используете первый подход.

Возможно, вы хотели использовать NHibernate.Linq (находится в Contrib project ). Что делает linq перевод для Критерии для вас.

1 голос
/ 13 января 2011

Я соединил два и сделал это:

var crit = _session.CreateCriteria(typeof (T)).SetMaxResults(100);
return (from x in _session.Linq<T>(crit) where x.field == <something> select x).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...