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 중국어 웹사이트의 기타 관련 기사를 참조하세요!