2009-03-10 2 views
1

Я пытаюсь получить этот запрос LINQ, чтобы возвращать точные соответствия, если они существуют, или результат «startswith», если нет. Сейчас он возвращает оба.LINQ to DataTable Фильтрация результатов

пример

SearchParam = "Мундта" Результаты = Мундта, Марк | Mundt, Chris | Mundth, Lori

public static DataTable SearchPerson(string SearhParam) 
    { 
     var context = new ConnectDataContext(Properties.Settings.Default.ConnectConnectionString); 
     var myQuery = (from person in context.tblPersons 
          where person.LastName.StartsWith(SearhParam) || person.LastName == SearhParam 
          orderby person.LastName 
          select new { person.PersonID, person.LastName, person.FirstName, person.SSN }); 

     var dataTable = myQuery.CopyLinqToDataTable(); 

     return dataTable; 
    } 

ответ

3

Try:

 var persons = (from person in context.tblPersons 
          orderby person.LastName 
          select new { person.PersonID, person.LastName, person.FirstName, person.SSN }); 
     var filteredPersonsList = persons.Where(p=>p.LastName == SearhParam).ToList(); 
     if(filteredPersons.Count == 0) 
      filteredPersonList = persons.Where(p=>p.LastName.StartsWith(SearhParam)) 
         .ToList(); 
     var dataTable = filteredPersonsList.CopyLinqToDataTable(); 

     return dataTable; 

Примечание: она делает 2 обращений к БД, один искать точное совпадение, и один для на StartsWith (если он не сделал найти первый).

Другой вариант - это захватить их обоих, а затем повторно фильтровать в памяти.

+0

2 попадания в db, вероятно, быстрее, потому что если матч существует, все готово. Если вы фильтруете в памяти, вам нужно выполнить поиск O (n), чтобы узнать, есть ли у вас еще работа. –

+0

y, хотя это зависит от сценария. Если количество людей значительно невелико, задержка в оба конца будет больше. Тем не менее, я бы не потел, если [вставить бизнес] идет хорошо, в системе будет много людей :) – eglasius

+0

Так как мой сценарий включает в себя запросы к локальной базе данных, я в порядке с несколькими вызовами. Спасибо! –