2009-03-10 7 views
1

J'essaie d'obtenir cette requête LINQ pour retourner les correspondances exactes si elles existent ou le résultat "startswith" sinon. En ce moment, il retourne les deux.Filtrage des résultats LINQ to DataTable

exemple

SearchParam = "Mundt" Résultats = 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; 
    } 

Répondre

3

Essayez:

 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; 

Note: il fait 2 coups à la DB, un à la recherche de correspondance exacte, et un pour le la startswith (si elle n'a pas trouve le premier).

Une autre option consiste à les attraper tous les deux, puis à les filtrer à nouveau dans la mémoire.

+0

Le 2 hits à la db est probablement plus rapide, car si le match existe vous avez terminé. Si vous filtrez en mémoire, vous devez effectuer une recherche O (n) pour savoir si vous avez encore du travail à faire. –

+0

y, bien que cela varie beaucoup par scénario. Si le nombre de personnes est considérablement réduit, le délai aller-retour sera plus long. Cela dit, je ne voudrais pas le suer, si [insérer des affaires] se passe bien il y aura beaucoup de gens dans le système :) – eglasius

+0

Depuis mon scénario implique d'interroger une base de données locale, je suis bien avec plusieurs appels. Merci! –