динамический запрос LINQ - PullRequest
2 голосов
/ 21 января 2011

Привет, я использую динамический linq, использую PredicateBuilder из LinqKit.

Если вы посмотрите на код, строка после комментария TODO, я хочу выполнить что-то вроде Позвольте сказать, что в objectList viz есть 2 объекта.object1, object2 (object1.property1 AND object1.property2) ИЛИ (object2.property1 AND object2.property2)

Я знаю, что строка после TODO неверна, но я ищу правильную версию этой строки.


  var finalPredicate = PredicateBuilder.True();

  foreach (var item in objectList)
  {
    var predicate = PredicateBuilder.True();
    predicate = predicate.And (p => p.Description.Contains (item.property1));
    predicate = predicate.And (p => p.Description.Contains (item.property2));
    //TODO: 
    finalPredicate = finalPredicate.Or(predicate);
  }
}

Ответы [ 3 ]

3 голосов
/ 21 января 2011
var finalPredicate = PredicateBuilder.True();

должно быть

var finalPredicate = PredicateBuilder.False();

True или x = всегда true (x игнорируется).

Ложь или х = х.


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

foreach (var item in objectList)
{
  var loopItem = item;
  //now use loopItem instead of item.
  ...
}
2 голосов
/ 21 января 2011

Разве finalPredicate не должен начинаться как False? Это всегда будет иметь значение true.


РЕДАКТИРОВАТЬ:

Посмотрев на код исключения, который вы разместили, я думаю, вы могли бы подумать об этом ОЧЕНЬ примерно как:

(псевдокод)

finalPredicate = 
    true || 
    (true && 
        p.ef.Contains(item.FilterDomain) && 
        p.fname.Contains(item.ff) && 
        p.subject.Contains(item.fs)
    )

Обратите внимание, что это НЕ то, что означает на самом деле ; вы строите дерево выражений, которое отличается от классического императивного C # (так что это редактирование, вероятно, требует от голосов). Но вам, возможно, будет легче думать об этом таким образом.

Итак, у вас есть как минимум две проблемы:

  • То, на что я и другие указывали, было первым true || .... Истинное значение || что-нибудь всегда даст Истину. Поэтому, если вы инициализируете finalPredicate Истиной, все это будет Истиной, несмотря ни на что. Фактически, ваши другие выражения могут даже не оцениваться , поэтому вы видите это исключение только при инициализации finalPredicate в False. Это единственный раз, когда ваш код получает удар.
  • Возможно, у вас есть ошибка где-то в цикле for, и я предполагаю, что это связано с этими вызовами Contains. Однако, не зная о вашей ситуации или задействованных данных, трудно сказать что-то большее.

Надеюсь, это поможет.

1 голос
/ 24 января 2011

Итак, я нашел решение на днях из другого вопроса stackoverflow, извиняюсь, что у меня нет ссылки на этот пост сейчас, но это решение

При использовании предиката в предикатеРасширить () это каждый раз.Смотрите следующую строку TODO с исправлением.Это решает мою проблему.

Также исправлена ​​истинная ложная проблема, но это была логическая ошибка.

var finalPredicate = PredicateBuilder.False();

  foreach (var item in objectList)
  {
    var predicate = PredicateBuilder.True();
    predicate = predicate.And (p => p.Description.Contains (item.property1));
    predicate = predicate.And (p => p.Description.Contains (item.property2));
    //TODO: 
    finalPredicate = finalPredicate.Or(predicate.Expand());
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...