En utilisant LINQ to Entities, comment puis-je déterminer si un élément d'une liste d'ints existe dans une chaîne d'entiers délimitée par des virgules?LINQ (aux entités) - Filtrage d'éléments à l'aide d'ints
Par exemple, je veux écrire quelque chose comme ce qui suit (logiquement):
collection.Where(collection.DelimitedStringOfInts.Contains(listOfInts.AnyOfThem))
Aussi, je dois mentionner que je fais cela à l'aide de méthodes enchaînées LINQ, avec la chaîne délimitée dans le cadre du entité -
var listOfInts = GetListOfInts();
var query = from x in Db.Items select x;
if (listOfInts != null && listOfInts.Count() > 0)
{
query = query.Where(x => x.DelimitedStringOfInts.Contains(listOfInts.AnyOfThem));
}
MISE à JOUR:
en utilisant l'article référencé Alex, je mis en œuvre une solution de travail comme suit:
var query = from x in Db.Items select x;
var listOfInts = GetListOfInts();
if (listOfInts != null && listOfInts.Any())
{
//"ToListOfStrings" is a simple extension method I wrote to create a List<string> from a List<int>
var delimitedIds = listOfInts.ToListOfStrings(',');
query = query.Where(
BuildOrExpression<DatabaseItem, string>(x => x.DelimitedStringOfInts, delimitedIds)
);
}
Une mise à jour était nécessaire pour le "BuildOrExpression" référencé dans l'article. L'opérateur "égal à" a dû être remplacé par un opérateur "contient".
var contains = values.Select(value =>
(Expression)Expression.Call(
valueSelector.Body,
typeof(string).GetMethod("Contains"),
Expression.Constant(
value,
typeof(TValue)
)
)
);
Juste un détail: avez-vous besoin de faire listOfInts.Count()> 0? Ne pouvez-vous pas faire listOfInts.Any() à la place? Count() va itérer toute la liste, mais Any() vérifiera s'il y a quelque chose à itérer. –
Bon conseil, merci! – Jeremy
Est-ce que cela donne un faux positif sur '10' si vous utilisez "contient" et que la chaîne que vous vérifiez est '100' ou '210'. – Arnstein