2010-11-25 210 views
0

我得到了下面這段代碼(很明顯)會給我帶來巨大的性能問題,並且尋求如何使它更好的建議。這個想法是,對於列表中的每個基礎項目,我查看是否至少有一個派生項目,如果沒有,我創建一個。問題是,對於每一個基本項目有一個單獨的數據庫查詢:優化NHibernate查詢

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

如果使用Criteria,則可以向條件添加別名以預取查詢的連接。

它會去是這樣的:

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

顯然,進而你就可以通過repeasting過程中得到來自其他表進一步信息。不要忘記將下一個別名映射到任何潛在的別名。


由於事實上,如果你不願意停止使用LINQ to NHibernate的,我建議你尋找到加入了的LINQ to NHibernate的。也許this post可以幫助

+0

太棒了,我來試一試 – ulu 2010-11-25 16:42:49