2016-08-02 14 views
0

Ich habe einige Probleme mit einer Suche. Ich versuche, einen Kunden auf Name + Nachname, Referenz oder CompanyName zu finden. Ich habe es geschafft zu arbeiten, aber die Bestellung ist nicht 100%.Linq/Lamba Nach mehreren Zeichenfolgen suchen

Hier ist mein ursprüngliches Objekt

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 
     }; 

Dann habe ich die folgenden Filter.

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

Obwohl dies einen fairen Job macht sich die Liste nicht wirklich logisch sinnvoll, da es nicht startet nicht begünstigt mit oben enthält.

Ich kam dann mit einer Ranking-Lösung, wo ich Rang beginnt mit höher als Enthält.

Hier ist mein Code dafür:

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 
     }; 

Ich würde dann wie folgt filtern:

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

Allerdings, wenn ich auf Referenz Suche macht es nichts zurück.

Also meine Frage ist, wird meine aktuelle Methode funktioniert auch warum gibt nichts zurück, wenn ich auf Referenz oder Firmennamen suche? Was würde die korrekte Art, ein StartsWith zu tun, dann beinhalten und immer noch eine Art alphabetischer Reihenfolge nach StartsWith List halten.

Bitte beachten Sie, ich bin immer noch ein Junior-Entwickler und jede Hilfe wäre willkommen.

+0

Was ist die Frage? – MichaelThePotato

+0

Ich habe meine Frage geändert. –

+0

versuchen, die Filterung und Ordnung in der ursprünglichen Abfrage oder Aufruf von 'ToList()' auf es vor der Filterung (nur eine Ahnung) – slawekwin

Antwort

0

Ich ging zurück zu den Grundlagen und das ist, was ich gefunden habe.

  //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(); 

Es scheint die Arbeit zu tun und die Leistung scheint sehr gut zu sein.

Verwandte Themen