我有以下代码(显然)给了我巨大的性能问题,我寻求如何使其更好的建议。我的想法是,对于列表中的每个基本项,我查看是否至少有一个派生项,如果没有,我创建一个。问题是,对于每个基本项,都有一个单独的数据库查询:
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;
}
你会如何改进这种代码?
答案 0 :(得分:0)
如果您使用Criteria,则可以在条件中添加别名以预取查询的联接。
它会是这样的:
DetachedCriteria.For(GetType(MyQueriedType)).CreateAlias("DerivedItem", "d", SqlCommand.JoinType.LeftOuterJoin)
显然,您可以通过重复该过程继续从其他表中获取更多信息。不要忘记将下一个别名映射到任何可能的别名。
事实上,如果你不愿意停止使用linq来进行nhibernate,我建议你查看linq到nhibernate的连接。也许this post可以提供帮助