2009-08-06 7 views
1

Est-ce que quelqu'un sait s'il existe un moyen de tester l'appartenance à une liste en utilisant une liste? Par exemple j'ai une classe nommée Membership qui a une propriété Rebates qui est de type List<Enums.RebateType>. Je veux tester en utilisant une expression lambda pour voir si cette liste contient des rabais qui sont d'un type spécifique. Ma orginal expression lambda est la suivanteTest pour la liste <T> appartenance à une liste <T>

return Membership.Rebates.Exists(rebate => 
    rebate.RebateType == Enums.RebateType.A && 
    rebate.RebateStatus == Enums.RebateStatus.Approved); 

au lieu d'avoir à faire ce qui suit:

return Membership.Rebates.Exists(rebate => 
    (rebate.RebateType == Enums.RebateType.A && 
    rebate.RebateStatus == Enums.RebateStatus.Approved) || 
    (rebate.RebateType == Enums.RebateType.B && 
    rebate.RebateStatus == Enums.RebateStatus.Approved)); 

Je me demandais si quelque chose de semblable à ce qui suit raillé jusqu'à la syntaxe SQL pourrait se faire via une expression lambda.

SELECT COUNT(*) 
FROM Membership.Rebates 
WHERE RebateType IN (ValidRebateTypes) AND Approved = true 

ValidRebateTypes est curently List<Enums.RebateType> que je teste pour savoir ValidRebateTypes = (Enums.RebateType.A, Enums.RebateType.B).

Le travail autour J'ai actuellement est comme suit:

bool exists = false; 
foreach (Enums.RebateType rebateType in ValidRebateTypes()) 
{ 
    exists = Membership.Rebates.Exists(
       rebate => 
       rebate.RebateType == rebateType && 
       rebate.RebateStatus == Enums.RebateStatus.Approved); 
    if (exists) { break; } 
} 
return exists; 

Répondre

4

Sons comme vous voulez:


Membership.Rebates.Where(r => ValidRebateTypes.Contains(r.RebateType) 
           && r.RebateStatus == Enums.RebateStatus.Approved); 

Vous pour le compte pouvez ensuite utiliser .Count():


Membership.Rebates.Where(r => ValidRebateTypes.Contains(r.RebateType) 
           && r.RebateStatus == Enums.RebateStatus.Approved) 
        .Count(); 

Ou .Any() pour déterminer l'existence de tout qui satisfait à cette condition


Membership.Rebates.Any(r => ValidRebateTypes.Contains(r.RebateType) 
          && r.RebateStatus == Enums.RebateStatus.Approved); 
+2

Si tout ce qu'il veut est de savoir s'il existe (pas le compte) alors utilisez '.Any()' au lieu de '.Count()', ainsi il peut quitter au premier match au lieu de passer par tout le shebang . –

+0

Bonne prise, je reproduisais simplement son SQL. – Marc

+2

Ou simplement remplacer Où avec tout et perdre le compte tout à fait. –

1

En plus de la suggestion de Marc, je recommanderais de faire ValidRebateTypes un HashSet<Enums.RebateType>. Non seulement cela est susceptible d'être plus efficace (même si ce n'est peut-être pas le cas pour un petit ensemble), mais cela révèle également votre intention (c'est-à-dire qu'il n'y a qu'une valeur de RebateType).

Questions connexes