2009-10-14 6 views
2

J'essaie de créer une méthode d'extension que je peux transmettre un IList de statuts et de vérifier la météo qu'ils existent, je pensais que la meilleure façon de le faire était un ILIST - mais peut-être que je me trompe? Est-ce la meilleure façon de passer plusieurs éléments à une méthode - une liste? C'est un LISTE générique donc pas de conversion, etc.LINQ: Vérifier si un champ (db) contient des éléments dans un ILIST?

Fondamentalement, j'ai ceci comme signature.

public static IQueryable<Building> WithStatus(this IQueryable<Building> qry, 
      IList<BuildingStatuses> buildingStatus) 
    { 

     //PSUEDO CODE 
     //return from v in qry 
     //  where v.Status is IN MY LIST called buildingStatus 
     //  select v; 
    } 

et de l'appeler que j'utilise (l'exemple ci-dessous est dans mon TDD), cela fonctionne très bien les valeurs arrivent dans ma méthode ci-dessus.

target.GetBuildings().WithStatus(new List<BuildingFilters.BuildingStatuses>() 
      { BuildingFilters.BuildingStatuses.Available, 
      BuildingFilters.BuildingStatuses.Decommissioned }); 

donc en gros j'ai ma liste (IList) arrive dans la méthode d'extension avec 2 valeurs qui est grande mais il faut dire LINQ je dois dire

 return from v in qry 
       where v.Status is IN MY LIST called buildingStatus 
       select v; 

apprécient vraiment d'aide,

en ce qui concerne ma méthode d'extension, il fonctionne comme je l'ai fait, mais similaire 1 seul type qui passe BuildingStatus donc seulement 1 ...

+0

Merci pour les deux commentaires, Oui, ce qui est grand, oublié de mentionner que je dois appeler une méthode d'extension sur chaque valeur de la liste des éléments appelés GetStringValue, car la liste est une collection de BuildingStatuses énumérations nommé, et GetStringValue est une méthode d'extension qui renvoie une chaîne que j'ai ajoutée sur chaque Enum via un attribut. Je suppose qu'une sorte de lambda pourrait faire ça? Je ne suis pas sûr, des idées? –

+0

Si je n'appelle pas la méthode d'extension (qui fonctionne) alors évidemment l'énumération retournera un entier et c'est une représentation de chaîne dont j'ai besoin. J'espère que je l'explique assez. –

+0

J'ai accepté une réponse car ma question a erré un peu, et la réponse acceptée me donne la solution que je cherchais –

Répondre

5

serait ce travail pour vous:

return from v in qry 
     where buildingStatus.Contains(v.Status) 
     select v; 
+0

Ne fonctionne pas avec les requêtes compilées bien que la question soit traitée. – usr

1

Vous pouvez utiliser la méthode d'extension IEnumerable<T>.Contains et permettre à votre méthode pour être plus polyvalent:

public static IQueryable<Building> WithStatus(this IQueryable<Building> qry, 
      IEnumerable<BuildingStatuses> buildingStatus) 
{ 

    return from v in qry 
      where buildingStatus.Contains(v.Status) 
      select v; 
} 
Questions connexes