Lins to Entities를 사용하는 'Contains ()'해결 방법은 무엇입니까?

.net-3.5 c# entity-framework linq linq-to-entities

문제

Silverlight ADO.Net 데이터 서비스 클라이언트 API (따라서 Linq To Entities)를 사용하여 where 절에있는 ID 목록을 사용하는 쿼리를 만들려고합니다. 누구도 지원되지 않는 Contains에 대한 해결책을 알고 있습니까?

나는 이런 식으로하고 싶다.

List<long?> txnIds = new List<long?>();
// Fill list 

var q = from t in svc.OpenTransaction
        where txnIds.Contains(t.OpenTransactionId)
        select t;

이것을 시도 :

var q = from t in svc.OpenTransaction
where txnIds.Any<long>(tt => tt == t.OpenTransactionId)
select t;

하지만 "Any '는 지원되지 않습니다.

수락 된 답변

업데이트 : EF ‰ ‰ 4 지원 (Checkout Any ) Contains 직접 Contains 있으므로 해결 방법이 필요하지 않습니다.

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));
}

//Optional - to allow static collection:
public static IQueryable<TEntity> WhereIn<TEntity, TValue>
  (
    this ObjectQuery<TEntity> query,
    Expression<Func<TEntity, TValue>> selector,
    params TValue[] collection
  )
{
  return WhereIn(query, selector, (IEnumerable<TValue>)collection);
}

용법:

public static void Main()
{
  using (MyObjectContext context = new MyObjectContext())
  {
    //Using method 1 - collection provided as collection
    var contacts1 =
      context.Contacts.WhereIn(c => c.Name, GetContactNames());

    //Using method 2 - collection provided statically
    var contacts2 = context.Contacts.WhereIn(c => c.Name,
      "Contact1",
      "Contact2",
      "Contact3",
      "Contact4"
      );
  }
}

인기 답변

당신은 e-sql (키워드 "it"에 주목하라.)을 코딩하면서 다시 손을 쓸 수있다.

return CurrentDataSource.Product.Where("it.ID IN {4,5,6}"); 

다음은 YMMV 컬렉션에서 일부 e-sql을 생성하는 데 사용한 코드입니다.

string[] ids = orders.Select(x=>x.ProductID.ToString()).ToArray();
return CurrentDataSource.Products.Where("it.ID IN {" + string.Join(",", ids) + "}");


아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.