首頁 > 後端開發 > C++ > 如何在不使用「Contains()」的情況下使用 ID 清單過濾 Linq to Entities 中的資料?

如何在不使用「Contains()」的情況下使用 ID 清單過濾 Linq to Entities 中的資料?

Susan Sarandon
發布: 2024-10-29 18:08:06
原創
951 人瀏覽過

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

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板