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
950 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!

source:php.cn
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