2016-08-02 5 views
0

У меня возникли проблемы с выполнением поиска. Я пытаюсь найти клиента по имени, фамилии, ссылке или CompanyName. Мне удалось заставить его работать, однако заказ не на 100%.Linq/Lamba Поиск по нескольким строкам

Вот мой исходный объект

var q = from row in DataAccess.metadata.db_Customer 
     where row.accountID == accountID 
     && row.isActive 
     orderby row.Name 
     select new bl_customerNames 
     { 
      customerID = row.customerID, 
      CustomerName = row.Name + " " + row.LastName, 
      Company = row.Company, 
      Reference = row.reference, 
      Email = row.Email, 
      CurrencyCode = row.CurrencyCode, 
      isSuspended = row.isSuspended 
     }; 

Тогда я сделал следующий фильтр.

if (!string.IsNullOrEmpty(search)) 
{ 
    q = q.Where(x => (x.CustomerName.Contains(search) || x.Reference.Contains(search) || x.Company.Contains(search))); 
} 

Хотя это делает справедливую работу список не реально сделать логический смысл, поскольку его не благоприятствовать начинается с выше Содержит.

Я тогда придумал решение для ранжирования, где я бы оценил старты с более высоким, чем Содержит.

Вот мой код, который:

var q = from row in DataAccess.metadata.db_Customer 
     where row.accountID == accountID 
     && row.isActive 
     orderby row.Name 
     select new bl_customerNames 
     { 
      customerID = row.customerID, 
      CustomerName = row.Name + " " + row.LastName, 
      Company = row.Company, 
      Reference = row.reference, 
      Email = row.Email, 
      CurrencyCode = row.CurrencyCode, 
      isSuspended = row.isSuspended, 
      Rank = ((row.Name + " " + row.LastName).StartsWith(search) || row.reference.StartsWith(search) || row.Company.StartsWith(search)) ? 1 : ((row.Name + " " + row.LastName).Contains(search) || row.reference.Contains(search) || row.Company.Contains(search)) ? 2 : 0 
     }; 

Я бы тогда фильтр так:

q = q.Where(r=>r.Rank > 0).OrderBy(r => r.Rank); 

Однако, если при поиске по ссылке он не возвращает ничего.

Так что мой вопрос будет мой текущий метод работы также почему ничего не возвращается, если я ищу по ссылке или название компании? Каков был бы правильный способ создания StartsWith, затем Содержит и все еще сохраняет своего рода алфавитный порядок после StartsWith List.

Пожалуйста, имейте в виду, что я все еще младший разработчик, и любая помощь будет оценена по достоинству.

+0

В чем вопрос? – MichaelThePotato

+0

Я изменил свой вопрос. –

+0

попробуйте помещать фильтрацию и заказывать в исходном запросе ИЛИ вызывать 'ToList()' на нем перед применением фильтрации (просто догадка) – slawekwin

ответ

0

Я вернулся к основам, и это то, что я придумал.

  //Get customers that starts with 
      var qSW = from row in DataAccess.metadata.db_Customer 
         where row.accountID == accountID 
         && row.isActive       
         where (row.Name + " " + row.LastName).StartsWith(search) 
         || row.Company.StartsWith(search) 
         || row.reference.StartsWith(search) 
         select new bl_customerNames 
         { 
          customerID = row.customerID, 
          CustomerName = row.Name + " " + row.LastName, 
          Company = row.Company, 
          Reference = row.reference, 
          Email = row.Email, 
          CurrencyCode = row.CurrencyCode, 
          isSuspended = row.isSuspended 

         }; 

      //Order 
      qSW = qSW.OrderBy(r => r.CustomerName).ThenBy(r => r.Company).ThenBy(r => r.Reference); 

      //Get customers that contains 
      var qC = from row in DataAccess.metadata.db_Customer 
         where row.accountID == accountID 
         && row.isActive 

         where (row.Name + " " + row.LastName).Contains(search) 
         || row.Company.Contains(search) 
         || row.reference.Contains(search) 
         select new bl_customerNames 
         { 
          customerID = row.customerID, 
          CustomerName = row.Name + " " + row.LastName, 
          Company = row.Company, 
          Reference = row.reference, 
          Email = row.Email, 
          CurrencyCode = row.CurrencyCode, 
          isSuspended = row.isSuspended        
         }; 

      //If search is less then 3 chars limit to 10 to help with performance 
      if(search.Count() > 2) 
       qC = qC.OrderBy(r => r.CustomerName).ThenBy(r => r.Company).ThenBy(r => r.Reference); 
      else 
       qC = qC.OrderBy(r => r.CustomerName).ThenBy(r => r.Company).ThenBy(r => r.Reference).Take(10); 

      //Concat list leaving out duplicates 
      var SList = qSW.Concat(qC); 


      // Return List 
      return SList.ToList(); 

Кажется, что работа и работа кажутся очень хорошими.