Heim >Backend-Entwicklung >C++ >Wie filtere ich Daten in Linq zu Entitäten mithilfe einer Liste von IDs ohne „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!