Entity Framework цепочка, где предложение - PullRequest
2 голосов
/ 05 августа 2011

Можно ли выполнить рефакторинг следующего запроса, чтобы i.Title.Contains(query) || i.Description.Contains(query) присутствовал только один раз, оставаясь в пределах одного запроса (без подзапросов) в результирующем sql?

if (extendedSearch)
{
    result = result.Where(i => i.Title.Contains(query) || i.Description.Contains(query)
        || (i.CreatedBy.FirstName + " " + i.CreatedBy.LastName).Contains(query)
        || (i.AssignedTo.FirstName + " " + i.AssignedTo.LastName).Contains(query)
    );
}
else
    result = result.Where(i => i.Title.Contains(query) || i.Description.Contains(query));

Ответы [ 2 ]

4 голосов
/ 05 августа 2011
result = result.Where(i => 
    i.Title.Contains(query) || i.Description.Contains(query)
 || (extendedSearch && 
      ((i.CreatedBy.FirstName + " " + i.CreatedBy.LastName).Contains(query)
   ||  (i.AssignedTo.FirstName + " " + i.AssignedTo.LastName).Contains(query))));

(скрестив пальцы, чтобы скобки были правильными ...)

Логическая структура в выражении Where: A или (extendedSearch and B)

Если extendedSearch равно false результат зависит только от A . Если extendedSearch равно true результат зависит от (A или B) - который, я надеюсь, представляет логику в вашем запросе.

1 голос
/ 05 августа 2011

Я не могу проверить это решение для себя сейчас, но это должно быть что-то вроде этого (TI - это тип i в вашем примере кода):

Func<TI, Boolean> predicate = i => i.Title.Contains(query) ||i.Description.Contains(query);

if (extendedSearch){
result = result.Where( i=>predicate(i) 
    || (i.CreatedBy.FirstName + " " + i.CreatedBy.LastName).Contains(query)
    || (i.AssignedTo.FirstName + " " + i.AssignedTo.LastName).Contains(query)
); } else result = result.Where(predicate);

это то, что вы ищете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...