Quel est l'équivalent LINQ à SQL opérateur IN
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?
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();