2016-09-02 2 views
0

Я пытаюсь отфильтровать несколько атрибутов из базы данных. Я фильтрую с 3 атрибутами. Который может быть пустым или ключом в любой комбинации. Я попробовал этот код, он работает нормально, когда я фильтруется в три этапа,if-else spipping стратегия поиска в запросе LINQ

IEnumerable<Employee> ItemsList = _db.Employees.AsEnumerable().Where(e => e.Role == 2).OrderByDescending(e => e.EmployeeID); 
if (!String.IsNullOrEmpty(SearchKeyByName)) 
      { 
       ItemsList = ItemsList.Where(e => e.FirstName.ToLower().StartsWith(SearchKeyByName.Trim().ToLower()) || e.LastName.ToLower().StartsWith(SearchKeyByName.Trim().ToLower()) || (e.FirstName + " " + e.LastName).ToLower().StartsWith(SearchKeyByName.Trim().ToLower())); 
       ViewBag.Search_FullName = SearchKeyByName; 
      } 
      if (!String.IsNullOrEmpty(SearchKeyByDepartment)) 
      { 
       ItemsList = ItemsList.Where(e => e.Department.DepartmentTitle.ToLower().StartsWith(SearchKeyByDepartment.Trim().ToLower())); 
       ViewBag.Search_Department = SearchKeyByDepartment; 
      } 
      if (!String.IsNullOrEmpty(SearchKeyByDesignation)) 
      { 
       ItemsList = ItemsList.Where(e => e.Designation.ToLower().StartsWith(SearchKeyByDesignation.Trim().ToLower())); 
       ViewBag.Search_Designation = SearchKeyByDesignation; 
      } 

Но я хочу, чтобы свести к минимуму это 3, если состояние с помощью LINQ, я попытался 1 этого с помощью этого кода

IEnumerable<Employee> ItemsList2 = (from e in _db.Employees.AsEnumerable() 
               where e.Role == 2 
               where (!String.IsNullOrEmpty(SearchKeyByName) && (e.FirstName.Trim().ToLower().StartsWith(SearchKeyByName.Trim().ToLower()) || e.LastName.ToLower().StartsWith(SearchKeyByName.Trim().ToLower()) || (e.FirstName + " " + e.LastName).ToLower().StartsWith(SearchKeyByName.Trim().ToLower()))) 
               select e).OrderByDescending(e => e.EmployeeID); 

Но результат фильтрации пуст/пуст. 1-й работает хорошо. Упомяните, что ключ поиска может быть пустым, тогда ему нужно заглянуть во все значения, но когда будет предоставлен ключ, тогда потребуются только ключевые выводы.

ответ

1

Проблема &&; вы требуете, чтобы SearchKeyByName всегда не был пустым/нулевым, используя это. Ваш фильтр должен хранить все записи, если SearchKeybyName недействителен или отсутствует или использовать его в поиске иначе: SearchKeyByName.IsNullOrEmpty() || (rest of it). Но в этом случае, вы можете даже упростить, что путем использования нулевых коалесцирующего, поскольку каждая строка начинается с пустой строкой:

var ItemsList2 = 
    from e in _db.Employees 
    let loweredSearch = (SearchKeyByName ?? "").Trim().ToLower() 
    where 
     e.Role == 2 
     && (
      (e.FirstName + " " + e.LastName).ToLower().StartsWith(loweredSearch) 
      || e.LastName.ToLower().StartsWith(loweredSearch) 
     ) 
    orderby e.EmployeeID descending 
    select e; 

Но это, вероятно, более эффективное:

var ItemsList2 = 
    from e in _db.Employees 
    let loweredSearch = (SearchKeyByName ?? "").Trim().ToLower() 
    where 
     e.Role == 2 
     && (
      loweredSearch == string.Empty 
      || (e.FirstName + " " + e.LastName).ToLower().StartsWith(loweredSearch) 
      || e.LastName.ToLower().StartsWith(loweredSearch) 
     ) 
    orderby e.EmployeeID descending 
    select e; 
+0

Спасибо - [@ Джейкоб] (http://stackoverflow.com/users/119549/jacob). он работает нормально, но как насчет следующих 2 фильтров? как я могу их фильтровать? –

+1

Используйте 'string.IsNullOrEmpty (loweredSearch)' вместо 'loweredSearch == string.Empty' может быть хорошим решением, потому что это может быть пустая строка. – gdmanandamohon

+0

@ShoumenAgdm, вы просто добавите их в цепочку '||'. – Jacob

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