Question

Avec LINQ, je dois vérifier si une valeur d'une ligne est présente dans un tableau.
L'équivalent de la requête SQL:

WHERE ID IN (2,3,4,5)

Comment puis-je faire?

Était-ce utile?

La solution

.Contains

var resultset = from x in collection where new[] {2,3,4,5}.Contains(x) select x

Bien sûr, avec votre problème simple, vous pourriez avoir quelque chose comme:

var resultset = from x in collection where x >= 2 && x <= 5 select x

Autres conseils

Effectuer l'équivalent d'un SQL avec IEnumerable.Contains () .

var idlist = new int[] { 2, 3, 4, 5 };

var result = from x in source
          where idlist.Contains(x.Id)
          select x;
db.SomeTable.Where(x => new[] {2,3,4,5}.Contains(x));

ou

from x in db.SomeTable
where new[] {2,3,4,5}.Contains(x)

Intersection et à l'exception sont un peu plus concis et sera probablement un peu plus rapide aussi.

collection.Intersect(new[] {2,3,4,5});

NOT IN

collection.Except(new[] {2,3,4,5});

ou

syntaxe Procédé de IN

collection.Where(x => new[] {2,3,4,5}.Contains(x));

et non

collection.Where(x => !(new[] {2,3,4,5}.Contains(x)));

Une déclaration de IEnumerable<T>.Contains(T) devrait faire ce que vous cherchez.

Un exemple très simple en utilisant .Contains ()

List<int> list = new List<int>();
for (int k = 1; k < 10; k++)
{
    list.Add(k);
}

int[] conditionList = new int[]{2,3,4};

var a = (from test in list
         where conditionList.Contains(test)
         select test);

Vous pouvez écrire l'aide-méthode:

    public bool Contains(int x, params int[] set) {
        return set.Contains(x);
    }

et utilisez le code court:

    var resultset = from x in collection
                    where Contains(x, 2, 3, 4, 5)
                    select x;

Voici une méthode d'extension générique qui peut être utilisé pour rechercher une valeur dans une liste de valeurs:

    public static bool In<T>(this T searchValue, params T[] valuesToSearch)
    {
        if (valuesToSearch == null)
            return false;
        for (int i = 0; i < valuesToSearch.Length; i++)
            if (searchValue.Equals(valuesToSearch[i]))
                return true;

        return false;
    }

Ceci peut être utilisé comme:

int i = 5;
i.In(45, 44, 5, 234); // Returns true

string s = "test";
s.In("aa", "b", "c"); // Returns false

Ceci est pratique dans les instructions conditionnelles.

Les situations ci-dessus fonctionnent lorsque la fonction Contains est utilisé contre les primitives, mais si vous faites affaire avec des objets (par exemple myListOrArrayOfObjs.Contains(efObj))?

J'ai trouvé une solution! Convertir votre efObj en string, thats séparés par _ pour chaque champ (vous pouvez presque penser comme une représentation CSV de votre obj)

Un exemple de peut ressembler à ceci:

     var reqAssetsDataStringRep = new List<string>();

        foreach (var ra in onDemandQueueJobRequest.RequestedAssets)
        {
            reqAssetsDataStringRep.Add(ra.RequestedAssetId + "_" + ra.ImageId);
        }

        var requestedAssets = await (from reqAsset in DbContext.RequestedAssets
                                     join image in DbContext.Images on reqAsset.ImageId equals image.Id
                                     where reqAssetsDataStringRep.Contains(reqAsset.Id + "_" + image.Id)
                                     select reqAsset
                                           ).ToListAsync();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top