Heim > Backend-Entwicklung > C++ > Wie filtere ich Daten in Linq zu Entitäten mithilfe einer Liste von IDs ohne „Contains()'?

Wie filtere ich Daten in Linq zu Entitäten mithilfe einer Liste von IDs ohne „Contains()'?

Susan Sarandon
Freigeben: 2024-10-29 18:08:06
Original
967 Leute haben es durchsucht

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

Linq to Entities 'Contains()' Alternative für ID-Filterung

Bei der Arbeit mit Silverlight ADO.Net Data Services ist das Fehlen von ' „Contains()“ in Linq to Entities stellt eine Herausforderung dar, wenn Daten mithilfe einer Liste von IDs gefiltert werden. Alternativ kann „Any()“ verwendet werden:

<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>
Nach dem Login kopieren

Dieser Ansatz führt jedoch zu einem Fehler „Die Methode „Any“ wird nicht unterstützt“.

Workaround Verwenden einer benutzerdefinierten Methode

Um diese Einschränkung zu überwinden, kann eine benutzerdefinierte LINQ-Methode „WhereIn()“ definiert werden:

<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>
Nach dem Login kopieren

Diese Methode akzeptiert einen Selektorausdruck und eine Sammlung von Werten zum Vergleich. Es generiert eine Reihe von Gleichheitsausdrücken, die dann mithilfe eines „OR“-Operators kombiniert werden. Der resultierende Ausdruck wird zum Filtern der Abfrage verwendet.

Verwendung

Die Methode „WhereIn()“ kann wie folgt verwendet werden:

<code class="csharp">var contacts = context.Contacts.WhereIn(c => c.Name, GetContactNames());</code>
Nach dem Login kopieren

Dieser Code filtert die Tabelle „Kontakte“, indem er Namen in der Sammlung „GetContactNames()“ abgleicht.

Update (EF 4 und höher)

Das ist erwähnenswert Entity Framework-Versionen 4 und höher unterstützen direkt die Methode „Contains()“, wodurch diese Problemumgehung überflüssig wird.

Das obige ist der detaillierte Inhalt vonWie filtere ich Daten in Linq zu Entitäten mithilfe einer Liste von IDs ohne „Contains()'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage