6
votes

LINQ-TO-SQL combinant deux expressions > ("Où clause") avec et / ou

Premièrement, je dois dire que j'ai lu plusieurs postes à ce sujet à Stackoverflow, mais je ne peux pas obtenir le résultat souhaité.

Permettez-moi d'expliquer le contexte (simplifié): J'utilise Linq-to-SQL pour interroger les clients Avec des visites récentes dans le magasin et (éventuellement) ne gagnez que celles avec une certaine quantité de paiements. Supposons avoir un modèle avec des classes de clients, de visites et de paiements. P>

Ainsi, concentrez-vous sur le où code> expression, j'essaye: P>

filter = c => 
           c.Visits.Any(v => v.VisitDate > DateTime.Now.Date.AddMonths(-(int)visitsSince)))
             && c => c.Payments.Sum(p => p.Quantity) > minPayment.Value;


1 commentaires

P.S., vous devriez utiliser la méthode expression.andalso () pour générer l'expression logique et expression ( && ). expression.et () génère le bit et l'expression ( & ).


3 Réponses :


4
votes

Vous n'abandonnez pas le résultat de et à quoi que ce soit.

Je suppose que la partie respective de votre code devrait lire comme suit: xxx

La chose est que votre (ou de même que vous avez mentionné) et fonction retourne l'expression contenant la conjonction de deux expressions. Il ne modifie pas l'objet qu'il est invoqué.


1 commentaires

@Francd, vous êtes la bienvenu. En passant, j'ai pris ma liberté pour réveiller votre question à la version originale, de sorte que d'autres visiteurs voient quel était le code d'origine réel. Sinon, les réponses ci-dessous n'ont aucun sens.



0
votes

Découvrez Linqkit et sa classe PredicateBuilder: http://www.albahaari.com/nutshell/ prédicatbuilder.aspx


2 commentaires

L'utilisation et la mise en œuvre que j'utilise provient de la classe Predicatebuilder et ne fonctionne pas ... Où est l'erreur?


@Francd Il y a une erreur dans votre usage, vois ma réponse.



1
votes

Le problème est cette ligne: xxx

La méthode et renvoie un autre délégué que vous n'avez pas affecté à rien. Essayez ceci: xxx

juste pour clarifier, et est une méthode qui prend deux expressions et combine leur logique pour créer une nouvelle expression. Cela ne change pas l'expression, il est exécuté, mais renvoie la nouvelle expression en tant que valeur de retour. Donc dans votre code, vous appelez filter.et (...) mais ne faisant rien avec la valeur de retour, donc filtre fait toujours référence à l'expression Lambda d'origine.


0 commentaires