2010-05-01 4 views
0

J'ai besoin de filtrer le parent par la valeur de propriété de la collection enfant. que je fais quelque chose comme ceci:linq-to-sql combine .any expression

var results = (from c in db.Customers where 
    c.Orders.Any(o => o.Status = (int)Status.Ordered) 
    select c; 

Il est très bien, mais maintenant je dois filtrer par 2 valeurs, à savoir prendre tous les enregistrements parents qui ont des dossiers chilren qui ont deux valeurs:

var results = (from c in db.Customers where 
    c.Orders.Any(o => o.Status == (int)Status.Ordered) && (o.Status == (int).Shipped)) 
    select c; 

Trying quelque chose d'évident comme ça ne fonctionne pas.

Répondre

2

Bien sûr, cela ne fonctionne pas. Vous filtrez les ordres qui satisfont une condition impossible. Vous dites: "obtenez-moi toutes les commandes dont le statut est égal à Ordonné et équivaut à Expédié en même temps". Ce n'est pas étonnant qu'il n'y ait pas de tels ordres. :-)

Si vous voulez obtenir tous les clients qui ont à la fois des commandes commandés et expédiés, vous avez pas d'autre choix que d'utiliser Any deux fois:

var results = (from c in db.Customers where 
    c.Orders.Any(o => o.Status == (int)Status.Ordered)) 
    && 
    c.Orders.Any(o => o.Status == (int)Status.Shipped)) 
    select c; 
+0

Merci pour la réponse. Oui, "ET" est incorrect ici, mais cela me donnera des clients qui ont des commandes «commandées» ou «expédiées», alors que j'ai besoin de clients qui ont des commandes «commandées» et «expédiées». – Victor

+0

Dans ce cas, vous n'avez pas d'autre choix que d'utiliser 'Any' deux fois. J'ai corrigé la réponse. –

+0

Merci, c'est exactement ce que je cherchais – Victor