首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用LINQ表达式代替NHIbernate.Criterion

用LINQ表达式代替NHIbernate.Criterion
EN

Stack Overflow用户
提问于 2009-04-24 06:47:29
回答 2查看 4K关注 0票数 3

如果要根据某些条件选择某些行,则可以在ICriterion中使用NHibernate.Criterion对象,如下所示:

代码语言:javascript
复制
  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子句过滤我想要的内容:

代码语言:javascript
复制
  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查询,因此它将在传入内存之前对数据进行过滤。这种性能节约是否足以证明它的使用是合理的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-04-24 07:55:11

像往常一样要看情况而定。首先,请注意,在第二个片段中,.List()return criteria之后就丢失了,还请注意,在这两个示例中都不会得到相同的结果。第一个执行where,然后返回top maxResults,第二个则首先选择top maxResults,然后执行where。

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

然而,通常您不会这样做,而是使用第一种方法。

也许您希望使用NHibernate.Linq (位于控制工程中)。把linq翻译成你的标准。

票数 3
EN

Stack Overflow用户

发布于 2011-01-13 09:38:40

我把这两者结合起来,做了这样的事情:

代码语言:javascript
复制
var crit = _session.CreateCriteria(typeof (T)).SetMaxResults(100);
return (from x in _session.Linq<T>(crit) where x.field == <something> select x).ToList();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/784770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档