2017-03-15 2 views
0

Ich habe meine searchString und möchte in der db Tabelle nach ein paar Eigenschaften (Name, PhoneNumber, EmailAddress etc.) suchen. Aber ich muss die Eigenschaft wissen, in der der SearchString gefunden wurde. Gibt es eine elegante Lösung? Jetzt habe ich viele ähnliche Codeblöcke (für Name ein, für Phone ein, ...) wie folgt aus:Datenbankattribut herausfinden wo Suchstring gefunden wurde (mit Entity Framework)

 var searchString = "text to search..."; 
     var searchResultItems = new List<SearchResultItem>();    
     // Search in client names 
     var clients = db.Clients.Where(x => x.Name.Contains(searchString)); // db context 
     foreach (var client in clients) 
     { 
      var searchResultItem = new SearchResultItem() 
      { 
       ResultLabel = client.Name, 
       SearchResultType = SearchResultType.ClientName, 
      }; 
      searchResultItems.Add(searchResultItem); 
     } 

Antwort

1

Sie es in einer kompakteren Weise schreiben kann, die in der gleichen Zeit eine bessere Lösung sein wird, aus Sicht der Leistung (wie Sie nur einzelne Feld aus der gesamten Tabelle auswählen wird):

var nameQuery = db.Clients 
    .Where(x => x.Name.Contains(searchString)) 
    .Select(x => new SearchResultItem { 
     ResultLabel = client.Name, 
     SearchResultType = SearchResultType.ClientName, 
    }); 

In ähnlicher Weise erstellen Sie phoneNumberQuery, emailAddressQuery usw.

Dann können Sie .Concat() alle solche Stücke in einzelne Abfrage wie dies:

var = searchResultItems = nameQuery 
    .Concat(phoneNumberQuery) 
    .Concat(emailAddressQuery) 
    .Concat(...) 
    .ToArray(); 

Sie können auch Ausdruck-Weg gehen und schreiben Verfahren wie

IQueryable<SearchResultItem> GetSearchQuery<T>(IQueryable<T> set, Expression<Func<T, string>> fieldSelector, string searchString, SearchResultType resultType) { 
    // homework here 
} 

die Auswahlabfragen basierend auf bestimmten Bereichen generieren, aber in Ihrem speziellen Fall, dass ich glaube nicht, dass es wert .

+0

Ich bin nicht sicher, es ist genau das, was ich suche (ich muss immer noch das Skript viele Male aufrufen), aber es scheint besser als meine Lösung. – Petr