Проблема с использованием предиката в цикле foreach - PullRequest
5 голосов
/ 19 октября 2011

У меня проблемы с построением предикатов в цикле foreach. Переменная, содержащая значение, в котором в данный момент находится перечислитель, должна быть указана в предикате.

Итак,

IQueryable query = getIQueryableSomehow();
Predicate = PredicateBuilder.False<SomeType>();
foreach (SomeOtherType t in inputEnumerable)
{
    Predicate = Predicate.Or( x => x.ListInSomeType.Contains(t) )
}
var results = query.Where(Predicate);

подводит меня. Все выражения ORed вместе в Predicate в основном все используют один и тот же t из inputEnumerable, когда, конечно, я хочу, чтобы каждое выражение ORed в Predicate использовало другой t из inputEnumerable.

Я посмотрел на предикат в отладчике после цикла, и он выглядит как IL. В любом случае каждая лямбда выглядит точно так же.

Может кто-нибудь сказать мне, что я могу делать здесь не так?

Спасибо

Isaac

Ответы [ 2 ]

4 голосов
/ 19 октября 2011

Проблема в том, как работают крышки.Вы должны скопировать экземпляр SomeOtherType t в локальный формат:

foreach (SomeOtherType t in inputEnumerable) 
{ 
    SomeOtherType localT = t;
    Predicate = Predicate.Or( x => x.ListInSomeType.Contains(localT) ) 
}

Для получения дополнительной информации см .: Захваченная переменная в цикле в C #

1 голос
/ 19 октября 2011

Вы закрываете переменную цикла . Объявите локальную переменную для SomeOtherType и используйте ее в своем предикате.

foreach (SomeOtherType t in inputEnumerable)
{
    var someOtherType = t;
    Predicate = Predicate.Or( x => x.ListInSomeType.Contains(someOtherType) )
}
...