使用LINQ表达式代替NHIbernate.Criterion

时间:2009-04-24 06:47:30

标签: linq nhibernate

如果我根据特定条件选择某些行,我可以在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的where子句来过滤我想要的内容:

  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
  3. 的形式学习另一种语法

    问题是第一个在第二个方面有任何性能优势吗?据我所知,第一个将创建SQL查询,因此它会在传递到内存之前过滤数据。这种性能的节省是否足以证明其使用的合理性?

2 个答案:

答案 0 :(得分:3)

像往常一样取决于。首先请注意,在您的第二个代码段中.List()之后return criteria错过了{{1}}并且还注意到两个示例都不会得到相同的结果。第一个在哪里然后返回顶部的maxResults,第二个然后首先选择top maxResults然后在哪里。

如果您的预期结果集相对较小并且您可能在延迟加载中使用某些结果,那么采用第二种方法实际上更好。因为通过会话加载的所有实体都将保留在其第一级缓存中。

通常你不这样做并使用第一种方法。

也许你想使用NHibernate.Linq(位于Contrib project)。 linq为您翻译为Criteria。

答案 1 :(得分:1)

我将两者结合起来并制作了这个:

var crit = _session.CreateCriteria(typeof (T)).SetMaxResults(100);
return (from x in _session.Linq<T>(crit) where x.field == <something> select x).ToList();