2009-03-06 66 views
2

我的實體子句上動態屬性具有從其他屬性LINQ(NHibernate的),其中在SQL

public class MyClass 
{ 
    public DateTime Deadline { get; set; } 
    public Severity Severity 
    { 
     return (DateTime.Now - Deadline < new TimeSpan(5, 0, 0, 0)) ? Severity.High : Severity.Low; 
    } 
} 

衍生的特性是有一種方法可以修改以下

return repository.Query().Where(myClass => myClass.Severity == High); 

所以where子句在sql中而不是在代碼中計算?

我試圖做這樣的事情,但都無濟於事

public class MyClass 
{ 
    public DateTime Deadline { get; set; } 
    public Func<MyClass, bool> SeverityFunc = (DateTime.Now - Deadline < new TimeSpan(5, 0, 0, 0)) ? Severity.High : Severity.Low; 
    public Severity Severity 
    { 
     return SeverityFunc.Invoke(this); 
    } 
} 

return repository.Query().Where(myClass => myClass.SeverityFunc(myclass) == High); 

我猜是因爲FUNC不能進行評估,以SQL。有一些其他的方式來做到這一點,並且沒有重複計算的結束了對嚴重

讚賞任何幫助,TA

編輯:這是什麼我嘗試做一個簡化版本,我正在尋找的答案是涵蓋了這個理論,而不是一個具體的解決方案(雖然仍然受歡迎)。我對什麼是可能的,以及實現這種事情的最佳實踐感興趣。

Andrew

回答

2

我在mapper上使用了類似的東西。請務必將Func鍵上Expr的,如:

public Expr<Func<MyClass, bool>> SeverityFunc ... 

通過與EXPR LINQ2SQL包裝就能夠看的充分體現和appropiately翻譯。我沒有使用它作爲你所擁有的類實例的一部分,所以我不確定它會如何影響它。

關於放在哪裏的問題,我不得不在最後一次處理類似的場景時進行,在我的情況下,它最終放在了映射器中,但主要是因爲它更像是一個來自非常數據庫模式的映射問題比領域邏輯。我甚至沒有動態計算域實體的屬性(肯定是不同的場景)。