2014-12-22 3 views
0

Я добавляю «поиск» функциональность в веб-приложение, я работаю и у меня есть следующий метод действия:C# содержит использование метода

public PartialViewResult SearchEmployees(string search_employees) 
     { 
      var employeeList = _db.Employees.ToList(); 
      var resultList = employeeList.Where(t => t.FirstName.Contains(search_employees)).ToList(); 
      return PartialView(resultList) 
     } 

здесь я пытаюсь отфильтровать всех сотрудников которые имеют первое имя, которое содержит строку поиска, однако я продолжаю получать нулевой список. Я неправильно использую выражение лямбда?

другой вопрос, есть .Contains кейс чувствительный? (Я знаю в java theres .equals и .equalsIgnoreCase, есть ли что-то похожее на это для .Contains?)

+5

Вы шли этот код в отладчике и проверить, что (а) 'search_employees' на самом деле имеет значение, и (б), что это значение, которое находится в некоторых из ваших имен сотрудников? В качестве одной из сторон вы не должны использовать '.ToList()' в этой первой строке. – JLRishe

+0

Я отлаживал, но не проверял, имеет ли значение search_employees значение, я сделаю это сейчас, но да, это значение в одном из имен моих сотрудников, спасибо за головы –

+0

@JLRishe yes theres значение, входящее в с search_employees и его значением у моего сотрудника –

ответ

4

Проблема была в первой строке .ToList().

NET string.Contains() способ есть, по умолчанию, чувствительный к регистру. Однако, если вы используете .Contains() в запросе LINQ to-Entities, Contains() будет следить за чувствительностью к регистру базы данных (большинство баз данных не чувствительны к регистру).

Когда вы назвали .ToList() в первой строке, он потянул вниз все ваших данных из базы данных, так что вторая строка делает обычный .NET .Contains(). Это не только дало вам неожиданные результаты, но и ужасно для производительности, поэтому, пожалуйста, сделайте ставку, чтобы использовать запрос до, вы используете .ToList() (если вы вообще используете .ToList()).

public PartialViewResult SearchEmployees(string search_employees) 
{ 
    var employeeList = _db.Employees; 
    var resultList = employeeList.Where(t => t.FirstName.Contains(search_employees)) 
           .ToList(); 
    return PartialView(resultList) 
} 
+0

Интересно, я думал, что вам нужно использовать '.IndexOf' в запросе LINQ to EF. Рад видеть, что '.Contains' поддерживается. – danludwig

0

Можете ли вы попробовать следующий код?

public PartialViewResult SearchEmployees(string search_employees) 
     { 
      var employeeList = _db.Employees.ToList(); 
      var resultList = employeeList; 
      if(!String.IsNullOrEmpty(search_employees)) 
       resultList = employeeList.Where(t => t.FirstName.Contains(search_employees)).ToList(); 
      return PartialView(resultList) 
     } 

Спасибо, Amit

+1

, это в основном мой код ... и если вы посмотрите на комментарии ниже моего вопроса, предложение JLRishe решило проблему. Этот код не будет работать, потому что у вас есть ToList() в первой строке –

+0

ok. nice solution –

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