2012-07-30 56 views
1

嘗試使用LINQ提供程序爲NHibernate編寫動態查詢,但我遇到了問題。我的理解是,LINQ查詢被推遲,直到調用(即具有ToList()),所以我有以下代碼:無法獲得延遲的LINQ語句在nHibernate中工作

string[] filteredIds = new[] { "someIdNotInUse"}; 

var result = _products 
    .GetAll() 
    .Skip(0) 
    .Take(10); 

if (filteredIds != null) 
{ 
    result.Where(x => x.Child1.Child2.Any(z => filteredIds.Contains(z.Child3.Id))); 
} 

var r = result.ToList(); 

的不施加在條件塊濾波器;當我運行.ToList時,我得到了我沒有預期的記錄。但是,如果我刪除了where過濾器並將其直接附加到_products調用,它將按預期工作。我誤解了LINQ提供程序的工作原理嗎?如何創建這樣的查詢,而不必爲每個可能的過濾條件和組合重寫查詢?

回答

5

LINQ中的方法不會影響它們被調用的對象 - 它們返回表示調用結果的對象新的。所以,你想:

if (filteredIds != null) 
{ 
    result = result.Where(...); 
} 

(你可以把它作爲一個有點像一個字符串調用ReplaceTrim - 字符串是不變的,所以這只是其中重要的返回值。)