Maison >développement back-end >C++ >Comment filtrer les données dans Linq to Entities à l'aide d'une liste d'identifiants sans \'Contient()\' ?

Comment filtrer les données dans Linq to Entities à l'aide d'une liste d'identifiants sans \'Contient()\' ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-29 18:08:06937parcourir

How to Filter Data in Linq to Entities Using a List of IDs Without 'Contains()'?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn