Maison >développement back-end >C++ >Comment filtrer les données dans Linq to Entities à l'aide d'une liste d'identifiants sans \'Contient()\' ?
Linq to Entities 'Contains()' Alternative pour le filtrage des identifiants
En travaillant avec Silverlight ADO.Net Data Services, l'absence de ' Contains()' dans Linq to Entities pose un défi lors du filtrage des données à l'aide d'une liste d'ID. Comme alternative, « Any() » peut être utilisé :
<code class="csharp">List<long?> txnIds = new List<long?>(); // Fill list var q = from t in svc.OpenTransaction where txnIds.Any<long>(tt => tt == t.OpenTransactionId) select t;</code>
Cependant, cette approche génère une erreur « La méthode « Any » n'est pas prise en charge ».
Solution de contournement en utilisant la méthode personnalisée
Pour surmonter cette limitation, une méthode LINQ personnalisée, 'WhereIn()', peut être définie :
<code class="csharp">public static IQueryable<TEntity> WhereIn<TEntity, TValue> ( this ObjectQuery<TEntity> query, Expression<Func<TEntity, TValue>> selector, IEnumerable<TValue> collection ) { if (selector == null) throw new ArgumentNullException("selector"); if (collection == null) throw new ArgumentNullException("collection"); if (!collection.Any()) return query.Where(t => false); ParameterExpression p = selector.Parameters.Single(); IEnumerable<Expression> equals = collection.Select(value => (Expression)Expression.Equal(selector.Body, Expression.Constant(value, typeof(TValue)))); Expression body = equals.Aggregate((accumulate, equal) => Expression.Or(accumulate, equal)); return query.Where(Expression.Lambda<Func<TEntity, bool>>(body, p)); }</code>
Cette méthode accepte une expression de sélecteur et une collection de valeurs à des fins de comparaison. Il génère une série d'expressions d'égalité qui sont ensuite combinées à l'aide d'un opérateur « OU ». L'expression résultante est utilisée pour filtrer la requête.
Utilisation
La méthode 'WhereIn()' peut être utilisée comme suit :
<code class="csharp">var contacts = context.Contacts.WhereIn(c => c.Name, GetContactNames());</code>
Ce code filtre la table « Contacts » en faisant correspondre les noms dans la collection « GetContactNames() ».
Mise à jour (EF 4 et versions ultérieures)
Il convient de noter que Entity Framework versions 4 et ultérieures prennent directement en charge la méthode « Contains() », rendant cette solution de contournement obsolète.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!