2009-03-10 15 views
1

Ich versuche, diese LINQ-Abfrage zu erhalten, um exakte Übereinstimmungen zurückzugeben, wenn sie vorhanden sind, oder das "startswith" -Ergebnis, wenn nicht. Gerade jetzt kehrt es beides zurück.LINQ zu DataTable Ergebnisfilterung

Beispiel

SearchParam = "mundt" Ergebnisse = Mundt, Mark | 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; 
    } 

Antwort

3

Versuchen:

 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; 

Hinweis: es hat zwei Treffer zum db, ein für genaue Übereinstimmung zu suchen, und ein für die den start (wenn es nicht finde die erste).

Eine andere Option ist, sie beide zu greifen und dann im Speicher neu zu filtern.

+0

Die 2 Treffer auf die db ist wahrscheinlich schneller, denn wenn die Übereinstimmung besteht, sind Sie fertig. Wenn Sie im Speicher filtern, müssen Sie O (n) suchen, nur um zu wissen, ob Sie noch Arbeit haben. –

+0

y, obwohl das pro Szenario sehr unterschiedlich ist. Wenn die Anzahl der Personen sehr gering ist, wird die Hin- und Rückfahrt länger dauern. Das heißt, ich würde es nicht schwitzen, wenn [Geschäft einfügen] gut geht, wird es eine Menge Leute im System geben :) – eglasius

+0

Da mein Szenario die Abfrage einer lokalen Datenbank betrifft, geht es mir gut mit mehreren Anrufen. Danke! –