2009-03-06 11 views
2

Mein Unternehmen hat eine Eigenschaft, die von anderen EigenschaftenLinq (bis nhibernate) where-Klausel auf dynamische Eigenschaft in 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; 
    } 
} 

ist es eine Möglichkeit, abgeleitet ist, ich die folgenden

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

ändern kann so dass die WHERE-Klausel in SQL und nicht in Code ausgewertet wird?

Ich habe versucht, so etwas zu tun, aber

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); 

Ich vermute, ohne Erfolg, weil die func kann nicht auf SQL ausgewertet werden. Gibt es eine andere Möglichkeit, dies zu tun, ohne

mit doppelten Berechnungen für Schwere enden

Jede Hilfe dankbar, ta

Edit: Dies ist eine vereinfachte Version von dem, was im Versuch, nach Antworten zu tun, ich bin auf der Suche, dass decken die Theorie von diesem eher als eine spezifische Reparatur ab (obwohl immer noch willkommen). Ich bin daran interessiert, was möglich ist, und Best Practices, um so etwas zu erreichen.

Andrew

Antwort

2

Ich habe etwas ähnliches auf einem Mapper verwendet. Achten Sie auf die Func auf auf Expr wickeln, wie:

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

indem sie sie mit ausdr linq2sql Einwickeln in der Lage, auf dem vollen Ausdruck zu suchen und übersetzen sachgemässer. Ich habe es nicht als Teil einer Klasseninstanz wie der, die du hast, benutzt, also bin ich mir nicht sicher, wie das das beeinflussen würde.

In Bezug auf, wo es zu setzen, musste ich bei der letzten Arbeit an einem ähnlichen Szenario bewegen, in meinem Fall endete es im Mapper, aber vor allem, weil es eher eine Mapping-Angelegenheit von einem schrecklichen Datenbankschema war als Domänenlogik. Ich hatte nicht einmal die Eigenschaft dynamisch auf der Domain-Entität für diese Angelegenheit berechnet (ein anderes Szenario sicher).