【问题标题】:Optimizing an NHibernate query优化 NHibernate 查询
【发布时间】: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;
}

你会如何改进这种代码?

【问题讨论】:

    标签: nhibernate optimization


    【解决方案1】:

    如果您使用 Criteria,则可以向条件添加别名以预取查询的联接。

    它会是这样的:

    DetachedCriteria.For(GetType(MyQueriedType)).CreateAlias("DerivedItem", "d", SqlCommand.JoinType.LeftOuterJoin)
    

    显然,您可以通过重复该过程继续从其他表中获取更多信息。不要忘记将下一个别名映射到任何潜在的别名。


    事实上,如果您不愿意停止使用 linq to nhibernate,我建议您查看 linq to nhibernate 的连接。或许this post 能帮上忙

    【讨论】:

    • 太棒了,我试试看
    • 当我使用 DetachedCriteria.For(GetType(MyQueriedType)) 时,我得到了特定类型的所有项目。但是,如果我有一个根实体和一个集合值属性要从中过滤,我该怎么做呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-30
    • 1970-01-01
    • 2015-09-25
    • 2012-06-15
    • 2011-01-19
    相关资源
    最近更新 更多