如果要根据某些条件选择某些行,则可以在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();
}当然,我更喜欢第二个。因为
问题是,第一个比第二个有什么性能优势吗?据我所知,第一个查询将创建SQL查询,因此它将在传入内存之前对数据进行过滤。这种性能节约是否足以证明它的使用是合理的?
发布于 2009-04-24 07:55:11
像往常一样要看情况而定。首先,请注意,在第二个片段中,.List()在return criteria之后就丢失了,还请注意,在这两个示例中都不会得到相同的结果。第一个执行where,然后返回top maxResults,第二个则首先选择top maxResults,然后执行where。
如果预期的结果集相对较小,并且可能在延迟加载中使用某些结果,那么最好采用第二种方法。因为通过会话加载的所有实体都将停留在其第一级缓存中。
然而,通常您不会这样做,而是使用第一种方法。
也许您希望使用NHibernate.Linq (位于控制工程中)。把linq翻译成你的标准。
发布于 2011-01-13 09:38:40
我把这两者结合起来,做了这样的事情:
var crit = _session.CreateCriteria(typeof (T)).SetMaxResults(100);
return (from x in _session.Linq<T>(crit) where x.field == <something> select x).ToList();https://stackoverflow.com/questions/784770
复制相似问题