J'ai un Entity Framework 4.0 Entity Object appelé Revision
avec les dates Nullable DateEffectiveFrom
et DateEffectiveTo
. Je me demandais s'il y avait un moyen sténographie d'interroger RevisionHistory
est un objet en fonction d'une date QueryDate
particulière au lieu d'avoir à utiliser la structure de requête suivante:Entity Framework Fonction de requête personnalisée
var results = EntityObject.Revisions.Where(x =>
(x.DateEffectiveFrom == null && x.DateEffectiveTo == null) ||
(x.DateEffectiveFrom == null && x.DateEffectiveTo >= QueryDate) ||
(x.DateEffectiveFrom <= QueryDate && x.DateEffectiveTo == null) ||
(x.DateEffectiveFrom <= QueryDate && x.DateEffectiveTo >= QueryDate));
J'ai essayé de créer la fonction booléenne suivante dans la Revision
classe:
partial class Revision
{
public bool IsEffectiveOn(DateTime date)
{
return (x.DateEffectiveFrom == null && x.DateEffectiveTo == null) ||
(x.DateEffectiveFrom == null && x.DateEffectiveTo >= date) ||
(x.DateEffectiveFrom <= date && x.DateEffectiveTo == null) ||
(x.DateEffectiveFrom <= date && x.DateEffectiveTo >= date));
}
...
}
Et puis mettre à jour la requête:
var results = EntityObject.Revisions.Where(x => x.IsEffectiveOn(QueryDate));
mais évidemment d ne traduisent pas en SQL. Toutes les idées seraient très appréciées.
Merci Robert - Cela semblait faire l'affaire pour toutes les requêtes IQuerable (c.-à-d. DataContext.Revisions). Toutes les idées pour les scénarios IEnumerable . PS - J'apprécie également l'explication détaillée de l'utilisation des prédicats dans l'article. –
Josh
Pour les scénarios IEnumerable, vous pouvez voir si [Dynamic Linq] (http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic- query-library.aspx) fonctionne. Notez que Dynamic Linq n'est pas fortement typé ... vous devez composer vos prédicats en tant que chaînes. –