gpt4 book ai didi

linq - 使用 LINQ 表达式代替 NHIbernate.Criterion

转载 作者:行者123 更新时间:2023-12-01 13:08:49 25 4
gpt4 key购买 nike

如果我要根据特定条件选择一些行,我可以在 NHibernate.Criterion 中使用 ICriterion 对象,例如:

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

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

最佳答案

像往常一样,这取决于。首先请注意,在您的第二个代码段中 .List() 紧跟在 return criteria 之后并且还请注意,您不会在这两个示例中获得相同的结果。第一个执行 where 然后返回 top maxResults,第二个则首先选择 top maxResults 然后执行 where。

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

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

也许您想使用 NHibernate.Linq(位于 Contrib project 中)。哪一个会为您将 linq 翻译成 Criteria。

关于linq - 使用 LINQ 表达式代替 NHIbernate.Criterion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/784770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com