优化 NHibernate 查询
Posted
技术标签:
【中文标题】优化 NHibernate 查询【英文标题】:Optimizing an NHibernate query 【发布时间】:2010-11-25 11:28:18 【问题描述】:我有以下代码(显然)给我带来了巨大的性能问题,我寻求关于如何使它变得更好的建议。这个想法是,对于列表中的每个基本项目,我查看是否至少有一个派生项目,如果没有,我创建一个。问题是,对于每个基础项目,都有一个单独的数据库查询:
var derivedItems = from item in baseItems select item.GetDerivedItem(session);
在哪里
public virtual DerivedListItem GetDerivedItem(ISession session)
var items = session.Query<DerivedItem>()
.Where(item => item.BaseItem == this);
if (items.Any())
return items.First();
var newItem = new DerivedItem(this);
session.Save(newItem);
return newItem;
你会如何改进这种代码?
【问题讨论】:
【参考方案1】:如果您使用 Criteria,则可以向条件添加别名以预取查询的联接。
它会是这样的:
DetachedCriteria.For(GetType(MyQueriedType)).CreateAlias("DerivedItem", "d", SqlCommand.JoinType.LeftOuterJoin)
显然,您可以通过重复该过程继续从其他表中获取更多信息。不要忘记将下一个别名映射到任何潜在的别名。
事实上,如果您不愿意停止使用 linq to nhibernate,我建议您查看 linq to nhibernate 的连接。或许this post 能帮上忙
【讨论】:
太棒了,我试试看 当我使用 DetachedCriteria.For(GetType(MyQueriedType)) 时,我得到了特定类型的所有项目。但是,如果我有一个根实体和一个集合值属性要从中过滤,我该怎么做呢?以上是关于优化 NHibernate 查询的主要内容,如果未能解决你的问题,请参考以下文章
您是不是会将 NHibernate 用于具有部分无法控制的遗留数据库的项目?