2013-05-30 2 views
0

У меня есть следующий метод расширения, который ведет себя как SQL IN:Как изменить этот метод расширения, принять два параметра строки?

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

Проблема заключается в том, что, когда я называю это так:

predicate = predicate.And(x => WhereIn(x.id, Ids)); 

Это дает мне ошибку: The type arguments for method 'WhereIn<TEntity,TValue>(System.Data.Objects.ObjectQuery<TEntity>, System.Linq.Expressions.Expression<System.Func<TEntity,TValue>>, params TValue[])' cannot be inferred from the usage. Try specifying the type arguments explictly.

x.id is a Ids are both of type string.

На самом деле я не хочу менять метод signaure, я хотел бы r изменить вызов, но я не уверен, что положить между скобками WhereIn<>.

ответ

1

Я думаю, что вы вызываете метод расширения неправильно.

Попробуйте так:

predicate = predicate.And(x => x.WhereIn(x.id, Ids)); 
+0

Я кладу, где расширение в статическом классе под названием Extensions, так что я не вижу x.WhereIn, так что это что-то вроде Extensions.WhereIn. – Xaisoft

+0

, если вы не видите x.WhereIn это означает, что у вас нет пространства имен класса Extensions в операторе using, OR x не имеет типа ObjectQuery . – RobSiklos

+0

x - это лицо в моем случае. – Xaisoft

Смежные вопросы