2010-08-25 55 views
1

這裏加入就是我想:如果我這樣做Settings.ID無法弄清楚如何做內的IQueryable

IQueryable query = this.MyRepository.GetShippingCollection(); 

IList<SomeListType> myList = query.Where(x => x.Settings 
             .Where(y => y.SelectorID.Equals(5)) 
             .Count() > 0) 
            .OrderBy(x => x.Order) 
            .ToList(); 

產生以下錯誤: 無法解析屬性它的工作原理,但在我的SQL Server導致超過3000個查詢:

IList<SomeListType> myList = this.MyRepository.GetShippingCollection().ToList(); 
myList = myList.Where(x => x.Settings 
         .Where(y => y.SelectorID.Equals(5)) 
         .Count() > 0) 
       .OrderBy(x => x.Order) 
       .ToList(); 

我知道解決方案駐留在使用「加入」。

我一直在尋找最近幾個小時的例子,只能在Mapping文件中找到Join例子。我也找到了「ICriteria」的例子。

我不想爲映射文件中的所有複雜查詢創建條目條目,因此該文件內的連接將不起作用。

由於我使用流利的NHibernate,我沒有使用「ICriteria」。我正在使用「IQueryable」。你如何加入「IQueryable」中的多個表格?

任何幫助,這將不勝感激。 在此先感謝。

+0

nhibernate linq提供程序可能不支持這個(不確定)。我可能會使用一個標準。 – 2010-08-26 06:01:09

回答

1

如果第二個查詢正在執行3,000個查詢,則幾乎可以肯定延遲加載Settings集合。在迭代列表時,您可以訪問這個集合,並且每次NHibernate返回數據庫來獲取它。 嘗試將Settings屬性的提取模式設置爲在映射中進行急切加載。

除此之外,LINQ提供商可能是一個問題。你使用的是什麼版本的NHibernate? 2.x LINQ提供者有一些實際的限制。它已被重新實現在3.0主幹中,但是你必須從源代碼下載並編譯它。

順便說一句,ICriteria vs IQueryable與Fluent NHibernate沒有關係。 Criteria API和LINQ是您可以通過它創建查詢的兩個提供者。流利的NHibernate是執行配置的另一種方式。

+0

這只是管理員中單個頁面上的問題。 感謝您的建議,並在大多數情況下,這將是正確的舉措。不幸的是,在我的情況下,它解決了更多的問題。它會導致我的其他頁面從SQL服務器中獲取太多數據。這是不好的,因爲SQL不是本地主機。 我追查了我必須做的事情。我需要使用ICriteria,並且在我使用的項目中設置Fluent NHibernate的方式沒有聲明,所以我不能輕易使用它。我正在努力通過添加它作爲一個選項。 感謝您的建議。 – 2010-08-30 13:47:24

+0

@Michael對不起,我不清楚。我的意思是將其設置爲熱切加載,以此來識別問題。如果可行,那麼不行,只有當你需要時,你纔不希望*總是*急切的加載。您可以在每個查詢的基礎上指定獲取模式,但我不清楚爲什麼您不能使用標準API。它不涉及FNH。如果你有一個'ISession'來做一個LINQ查詢,你可以做一個標準查詢。 – Jay 2010-08-30 14:03:35

+0

我選擇這個作爲答案,因爲急切的加載解決了大約2/3的問題。 ICriteria不可用,因爲它沒有在自定義NHibernate接口中列出。我將它添加到自定義的NHibernate接口中,並且該選項可用。我完全可以通過使用ICriteria來解決問題。感謝您給我這個想法,從另一個角度來看待它。 – 2010-09-01 22:06:51