112 votes

Linq to SQL : comment faire "where [column] in (list of values)" ?

J'ai une fonction dans laquelle je reçois une liste d'identifiants et je dois renvoyer la liste correspondant à une description associée à l'identifiant. Par exemple :

public class CodeData
{
    string CodeId {get; set;}
    string Description {get; set;}
}

public List<CodeData> GetCodeDescriptionList(List<string> codeIDs)
    //Given the list of institution codes, return a list of CodeData
    //having the given CodeIds
}

Donc, si je devais créer moi-même le sql pour cette opération, je ferais simplement quelque chose comme ce qui suit (où la clause in contient toutes les valeurs de l'argument codeIds) :

Select CodeId, Description FROM CodeTable WHERE CodeId IN ('1a','2b','3')

Dans Linq to Sql, je n'arrive pas à trouver l'équivalent de la clause "IN". La meilleure que j'ai trouvée jusqu'à présent (qui ne fonctionne pas) est la suivante :

 var foo = from codeData in channel.AsQueryable<CodeData>()
           where codeData.CodeId == "1" || codeData.CodeId == "2"
           select codeData;

Le problème est que je ne peux pas générer dynamiquement une liste de clauses "OR" pour linq to sql, car elles sont définies au moment de la compilation.

Comment réaliser une clause where qui vérifie qu'une colonne se trouve dans une liste dynamique de valeurs en utilisant Linq to Sql ?

0voto

M G Points 39

Voici comment je fais en utilisant HashSet

        HashSet<String> hs = new HashSet<string>(new String[] { "Pluto", "Earth", "Neptune" });
        String[] arr =
        {
            "Pluto",
            "Earth",
            "Neptune",
            "Jupiter",
            "Saturn",
            "Mercury",
            "Pluto",
            "Earth",
            "Neptune",
            "Jupiter",
            "Saturn",
            "Mercury",
            // etc.
        };
        ICollection<String> coll = arr;

        String[] arrStrFiltered = coll.Where(str => hs.Contains(str)).ToArray();

HashSet est pratiquement à O(1), donc votre complexité reste O(n).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X