>백엔드 개발 >C++ >\'Contains()\' 없이 ID 목록을 사용하여 Linq의 데이터를 엔터티로 필터링하는 방법은 무엇입니까?

\'Contains()\' 없이 ID 목록을 사용하여 Linq의 데이터를 엔터티로 필터링하는 방법은 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-29 18:08:06950검색

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

ID 필터링을 위한 Linq to Entities 'Contains()' 대안

Silverlight ADO.Net 데이터 서비스 작업 시 'Contains()'가 없습니다. Linq to Entities의 Contains()'는 ID 목록을 사용하여 데이터를 필터링할 때 문제를 제기합니다. 대안으로 '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()' 컬렉션의 이름과 일치하여 'Contacts' 테이블을 필터링합니다.

업데이트(EF 4 이상)

참고할 가치가 있습니다 Entity Framework 버전 4 이상에서는 'Contains()' 메서드를 직접 지원하므로 이 해결 방법은 더 이상 사용되지 않습니다.

위 내용은 \'Contains()\' 없이 ID 목록을 사용하여 Linq의 데이터를 엔터티로 필터링하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.