优化 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 查询

您是不是会将 NHibernate 用于具有部分无法控制的遗留数据库的项目?

NHibernate查询优化的相关资料

Linq To Nhibernate 性能优化(入门级)

如何让 NHibernate 停止使用 nvarchar(4000) 插入参数字符串?

C#中,某一多属性类的排序该如何实现?不用LinQ。