2012-01-10 39 views
0

我有一套我用Linq和NHibernate獲取的子類域對象。這裏是什麼,我有一個例子:我可以允許查詢的對象影響用Linq和NHibernate獲取它們的查詢嗎?

public abstract class Car { 
    public abstract bool Runs(); 
} 

public class Junker : Car { 
    public override bool Runs() { 
     return false; 
    } 
} 

public class NewCar : Car { 
    public override bool Runs() { 
     return true; 
    } 
} 

我需要做的僅僅是Run()去取車。所以,我想這樣做:

var goodCars = _session.Query<Car>().Where(car => car.Runs()); 

...但是,這並不工作,因爲Runs()是不支持查詢源。這裏的錯誤,我得到:

Cannot parse expression 'car' as it has an unsupported type. Only query sources (that is, expressions that implement IEnumerable) and query operators can be parsed.

我已經試過分開查詢分爲兩個步驟:1)讓所有的汽車,2)過濾器通過Runs() ......但我不能這樣做,因爲它打破延遲加載(我的域模型比我的汽車示例稍微複雜一些)。此外,我只想從數據庫中提取實際符合我的查詢的項目。

有沒有辦法做我想做的事情?

回答

2

你不能這樣做。你試圖做的事情是不可能轉化爲一個SQL查詢,因爲這是所有NHibernate最終做的......不。

要獲得所有與一個查詢將要求您下降到數據庫級別和使用一些非領域知識。我建議將其隱藏在服務界面之後。

public interface RunningCars IEnumerable All(); }

並使用自定義sql查詢或存儲過程來實現它。

如何在2個步驟中打破延遲加載?也許你需要指定你想在初始查詢期間預取那些asociations。

此外,在這個特定的例子中,你不能只獲取NewCar的所有實例嗎?

0

如果轉換運行到一個只讀屬性

public virtual bool Runs {get; private set;} 

您可以在HBM關聯和查詢運行屬性。但作爲這不是你的實際模型,確實沒有辦法幫助指導你只是說

  1. 變化模型
  2. 不能查詢對象的方法
+0

你忘了命名變量。 – gdoron 2012-01-10 19:58:21

+0

自動屬性,不需要後臺字段。 – 2012-01-10 20:20:28

+0

這不會編譯...嘗試自己。 – gdoron 2012-01-11 07:10:38