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
Libérer: 2024-10-29 18:08:06
original
967 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal