Home >Backend Development >C++ >How to Filter Data in Linq to Entities Using a List of IDs Without \'Contains()\'?
Linq to Entities 'Contains()' Alternative for ID Filtering
In working with Silverlight ADO.Net Data Services, the absence of 'Contains()' in Linq to Entities poses a challenge when filtering data using a list of IDs. As an alternative, 'Any()' can be employed:
<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>
However, this approach yields an "The method 'Any' is not supported" error.
Workaround using Custom Method
To overcome this limitation, a custom LINQ method, 'WhereIn()', can be defined:
<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>
This method accepts a selector expression and a collection of values for comparison. It generates a series of equality expressions that are then combined using an 'OR' operator. The resulting expression is used to filter the query.
Usage
The 'WhereIn()' method can be used as follows:
<code class="csharp">var contacts = context.Contacts.WhereIn(c => c.Name, GetContactNames());</code>
This code filters the 'Contacts' table by matching names in the 'GetContactNames()' collection.
Update (EF 4 and Later)
It's worth noting that Entity Framework versions 4 and later directly support the 'Contains()' method, making this workaround obsolete.
The above is the detailed content of How to Filter Data in Linq to Entities Using a List of IDs Without \'Contains()\'?. For more information, please follow other related articles on the PHP Chinese website!