2009-03-06 4 views
2

Mon entité a une propriété qui est dérivé d'autres propriétésLINQ (à NHibernate) où la clause sur la propriété dynamique 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; 
    } 
} 

est-il un moyen que je peux modifier les éléments suivants

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

si que la clause where évalue en sql plutôt qu'en code?

J'ai essayé de faire quelque chose comme ça, mais en vain

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

Je devine que parce que le func ne peut pas être évalué à SQL. Y at-il une autre façon de le faire sans se retrouver avec des calculs en double pour la gravité

Toute aide appréciée, ta

Edit: Ceci est une version simplifiée de ce qui im ​​essayant de faire, je suis à la recherche des réponses que couvrir la théorie de ce plutôt qu'une solution spécifique (bien que toujours la bienvenue). Je suis intéressé par ce qui est possible, et les meilleures pratiques pour réaliser ce genre de chose.

Andrew

Répondre

2

J'ai utilisé quelque chose de similaire sur un mapper. Assurez-vous d'envelopper le Func sur le Expr, comme:

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

en l'enveloppant avec expr linq2sql sera en mesure de regarder la pleine expression et de traduire appropiately. Je ne l'ai pas utilisé dans le cadre d'une instance de classe comme celle que vous avez, donc je ne suis pas sûr de savoir comment cela l'affecterait. En ce qui concerne l'endroit où le mettre, je devais passer à la dernière fois que j'ai travaillé sur un scénario similaire, dans mon cas, il a fini dans le mappeur, mais surtout parce que c'était plus un problème de cartographie d'un schéma de base de données que la logique du domaine. Je n'ai même pas eu la propriété calculée dynamiquement sur l'entité de domaine d'ailleurs (un scénario différent à coup sûr).

Questions connexes