2012-02-17 2 views
1

Я использую предикаты для уточнения параметров поиска и получаю два разных результата, когда я запускаю то, что похоже на тот же запрос.Entity Framework с использованием Predicates Issue

Это один правильный и возвращает ожидаемые результаты: (жесткий закодированных строк)

_predicate = PredicateBuilder.False<TBLDESIGN>(); 
_predicate = _predicate.Or(a => a.IS_APPROVED == true & a.ACTIVE == true & a.DATE_APPROVED > beginDate & (a.KEYWORDS.Contains("red") || a.NAME.Contains("red"))); 
_predicate = _predicate.Or(a => a.IS_APPROVED == true & a.ACTIVE == true & a.DATE_APPROVED > beginDate & (a.KEYWORDS.Contains("geos") || a.NAME.Contains("geos"))); 

Это один только возвращает результаты второго предиката «ГЕОС». Первый в цикле («красный») игнорируется. Значения «красный» и «геос» находятся внутри цикла ниже.

string searchTerm = ""; 
_predicate = PredicateBuilder.False<TBLDESIGN>(); 
for (int i = 0; i < search.Count(); i++) 
{ 
    searchTerm = search[i].SearchTerm.Trim().ToString(); 
    _predicate = _predicate.Or(a => a.IS_APPROVED == true & a.ACTIVE == true & a.DATE_APPROVED > beginDate & (a.KEYWORDS.Contains(searchTerm) || a.NAME.Contains(searchTerm))); 
} 

Вот остальная часть запроса, если это имеет значение.

  var results = 
         dbContext.TBLDESIGN 
         .Include(s => s.LKPRICE) 
         .Include(s => s.TBLDESIGNER) 
         .AsExpandable().Where(_predicate) 
         .OrderByDescending(s => s.DATE_APPROVED) 
         .Select(s => new 
         { 
          s.ACTIVE, 
          s.DATE_CREATED, 
          s.EXPORTED, 
          s.IMAGE_PATH, 
          DesignId = s.ID, 
          s.IS_APPROVED, 
          s.TBLDESIGNER.FIRST_NAME, 
          s.TBLDESIGNER.LAST_NAME, 
          s.TBLDESIGNER.ALIAS, 
          s.NAME, 
          s.LKPRICE.PRICE, 
          s.COMPLETED, 
          s.DATE_APPROVED, 
          DesignerId = s.TBLDESIGNER.ID, 
          s.VIEW_COUNT 
         }).ToList(); 

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

Спасибо, Билли

Ответ:

_predicate = PredicateBuilder.False<TBLDESIGN>(); 
for (int i = 0; i < search.Count(); i++) 
{ 
    string searchTerm = search[i].SearchTerm.Trim().ToString(); 
    _predicate = _predicate.Or(a => a.IS_APPROVED == true & a.ACTIVE == true & a.DATE_APPROVED > beginDate & (a.KEYWORDS.Contains(searchTerm) || a.NAME.Contains(searchTerm))); 
} 
+0

Понял это. Объявление строки поискаTerm должно выполняться внутри цикла каждый раз, когда создается предикат. Ответ выше. –

ответ

2

строка декларации должна происходить внутри цикла.

_predicate = PredicateBuilder.False<TBLDESIGN>(); 
    for (int i = 0; i < search.Count(); i++) 
    { 
     string searchTerm = search[i].SearchTerm.Trim().ToString(); 
     _predicate = _predicate.Or(a => a.IS_APPROVED == true & a.ACTIVE == true & a.DATE_APPROVED > beginDate & (a.KEYWORDS.Contains(searchTerm) || a.NAME.Contains(searchTerm))); 
    } 
Смежные вопросы