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
Susan SarandonOriginal
2024-10-29 18:08:06950Durchsuche

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>

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>

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>

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!

Stellungnahme:
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