2010-06-30 3 views
1

Je suis un peu bloqué sur la requête linq suivante. J'essaie de trouver toutes les commandes qui ont un état autre que «Terminé», ou qui ont été terminées au cours du dernier mois.Aide sur la logique OU dans Linq lambda query

_ordersRepository.GetAllByFilter(
    o => o.OrderStatus 
     .OrderByDescending(os => os.StatusUpdate.Date) 
     .First() 

      // so at this point I have found the most recent status, 
      // and I need to do something like... 

      /* pseudo code */ 
      WHERE 
       StatusUpdate.StatusType.Name != "Completed" 
      OR 
       StatusUpdate.Date > DateTime.Today.AddMonths(-1) 
    ); 

EDIT pour clarifier: La difficulté que je vais avoir est que je n'ai pas un moyen direct pour obtenir l'état actuel comme Order.Status. Le statut est historiquement conservé dans un tableau StatusUpdate. Un StatusUpdate est connecté à un Order par une table de liens OrderStatus (un ordre a beaucoup de StatusUpdates). Donc, si vous regardez mon code tentative ci-dessus, vous voyez que je suis DECOUVRIR l'état actuel avec:

Order.OrderStatus.OrderByDescending(os => os.StatusUpdate.Date).First()

Cela me donne un StatusUpdate correspondant à l'état actuel de la commande. Je dois maintenant vérifier:

StatusUpdate.StatusType.Name == "Completed" // StatusType is like an enum lookup table 
OR 
StatusUpdate.Date > lastMonth 

Je peux presque obtenir comment je pouvais le faire, mais pas sans être horriblement inefficace.

Répondre

1

Je pense que je l'ai maintenant. C'est comme si je le faisais dans mes applications, j'ai des Statuts, des Commandes et une table "Mouvements" où le dernier est le courant. Mise à jour de mon exemple

DateTime dateToMatch = DateTime.Today.AddMonths(-1); 
var orders = from c in Context.Orders 
let currentMovement == c.Movements.OrderByDescending(x => x.PerformedOn).FirstOrDefault() 
let currentStatusName == currentMovement.Status.Name 
where currentStatusName != "Completed" || (currentStatusName == "Completed" && currentMovement.PerformedOn > dateToMatch) 
select c; 
+0

Oui je pense que ce que j'ai besoin, merci. Je ne savais pas à propos de "let". Un seul problème cependant: ma méthode GetAllByFilter sur mon dépôt prend un paramètre lambda. Est-il même possible d'écrire cette requête dans la syntaxe lambda? – fearofawhackplanet