2014-12-17 3 views
4

У меня есть информация о пользователе. Я пытаюсь выполнить поиск, который может использовать фамилию, идентификатор пользователя или роль пользователя. У меня есть текстовое поле поиска для имени и идентификатора и раскрывающегося списка поиска для роли пользователя. Не все могут быть пустыми, но любое сочетание может использоваться. Я использую следующие, но дон; т думаю, что это правильно, так как она всегда возвращает весь DataTable:Поиск datatable с использованием Linq to dataset

dtUsers.CaseSensitive = false; 
var results = dtUsers.AsEnumerable() 
    .Where(r => r.Field<String>("LASTNAME").Contains(tbName.Text.Trim()) 
      || r.Field<String>("USERID").Contains(tbUserID.Text.Trim()) 
      || r.Field<String>("USERROLELIST").Contains(ddlRoles.SelectedItem.Text));    

dtUsers = results.CopyToDataTable(); 

Что я делаю неправильно? Мне также нужно сделать частичный поиск по имени и идентификатору.

ответ

3

Измените условие для проверки пустой строки первой (Используйте String.IsNullOrWhiteSpace) , а затем применить свой фильтр, как:

var results = dtUsers.AsEnumerable() 
    .Where(r =>(!String.IsNullOrWhiteSpace(tbName.Text) && r.Field<String>("LASTNAME").Contains(tbName.Text.Trim()) 
      || (!String.IsNullOrWhiteSpace(tbUserID.Text) &&r.Field<String>("USERID").Contains(tbUserID.Text.Trim()) 
      || r.Field<String>("USERROLELIST").Contains(ddlRoles.SelectedItem.Text)); 

Аналогично вы можете сделать это с последним условием, так как:

(ddlRoles.SelectedItem != null && 
!String.IsNullOrWhiteSpace(ddlRoles.SelectedItem.Text) && 
    r.Field<String>("USERROLELIST").Contains(ddlRoles.SelectedItem.Text) 
+0

Спасибо, Хабиб, работает. Он ожидал полного совпадения, поэтому я изменил. Содержит (...) в .IndexOf (...), и я могу искать частичное имя или идентификатор. Однако, несмотря на то, что я отключил dtUser.CaseSensitive = false, он ожидает точного совпадения. Если я наберу «smi», он не вернет пользователя «Смит», но «Сми» будет. – NoBullMan

+0

Для нечувствительного к регистру содержимого используйте 'IndexOf (tbName.Text, StringComparison.InvariantCultureIgnoreCast)> -1)' Смотрите: http://stackoverflow.com/questions/444798/case-insensitive-containsstring – Habib

+0

@NoBullMan, до ' Свойство CaseSenstive' связано с тем, что оно будет использоваться, когда вы DataTable.Select' (свойство CaseSensitive влияет на сравнение строк при сортировке, поиске и фильтрации) ', это не повлияет на какой-либо запрос на основе LINQ – Habib