Je le modèle suivant:Comment ET prédicats dans la clause WHERE dans un LINQ pour RavenDB requête
public class Clip {
public Guid ClipId { get; set; }
public IList<StateChange> StateChanges { get; set; }
}
public class StateChange {
public string OldState { get; set; }
public string NewState { get; set; }
public DateTime ChangedAt { get; set; }
}
Et voilà comment un corbeau de requête:
var now = DateTime.UtcNow;
var since = now.AddSeconds(60);
string state = "some state of interest";
using (var session = docStore.OpenSession()) {
RavenQueryStatistics stats;
session.Query<Clip>()
.Statistics(out stats)
.Where(
p => p.StateChanges.Any(a => (since > a.ChangedAt && a.NewState == state))
&& !p.StateChanges.Any(a => (a.OldState == state && now > a.ChangedAt)))
.ToArray();
return stats.TotalResults;
}
Je veux obtenir le comptent pour tous les Clip
enregistrements qui ont un (StateChange.CreatedAt
avant since
et NewState
est "some state of interest"
) et ne pas avoir un (StateChange.CreatedAt
avant now
et OldState
est "some state of interest"
). Bien que le prédicat utilisé ci-dessus fonctionne dans linq pour objecter, il ne semble pas fonctionner dans linq à corbeau (c'est-à-dire qu'il ne renvoie pas le résultat attendu). Je soupçonne que c'est parce que l'expression && !.p.StateChanges.Any....
n'est jamais évaluée si l'expression sur le côté gauche évalue à vrai. Y a-t-il un moyen de contourner ce problème?
Que voulez-vous dire par "Ne fonctionne pas"? Y a-t-il une erreur? –
Non, cela signifie qu'il ne renvoie pas les résultats attendus, c'est-à-dire qu'il ignore l'expression de droite –
Comment savez-vous qu'il l'ignore? Si la première condition est vraie, elle doit évaluer la bonne condition pour obtenir le résultat complet de la condition. –