Linq to Entities 'Contains()' ID 過濾替代方案
在使用Silverlight ADO.Net 資料服務時,缺少'使用ID當清單過濾資料時,Linq to Entities 中的Contains()' 提出了挑戰。作為替代方案,可以使用「Any()」:
<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>
但是,這種方法會產生「不支援『Any』方法」錯誤。
解決方法使用自訂方法
要克服此限制,可以定義自訂LINQ 方法「WhereIn()」:
<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>
此方法接受選擇器表達式和集合用於比較的值。它產生一系列等式表達式,然後使用“OR”運算符組合這些表達式。產生的表達式用於過濾查詢。
用法
'WhereIn()'方法可以如下使用:
<code class="csharp">var contacts = context.Contacts.WhereIn(c => c.Name, GetContactNames());</code>
此程式碼透過配對「GetContactNames()」集合中的名稱來篩選「聯絡人」表。
更新(EF 4 及更高版本)
值得注意的是實體框架版本4 及更高版本直接支援「Contains()」方法,使此解決方法過時。
以上是如何在不使用「Contains()」的情況下使用 ID 清單過濾 Linq to Entities 中的資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!