2017-03-15 17 views
0

私は自分のsearchStringを持っていて、いくつかのプロパティ(Name、PhoneNumber、EmailAddressなど)でdbテーブルを検索したいと考えています。しかし、私はsearchStringが見つかったプロパティを知る必要があります。どの優雅な解決策はありますか? 今、私はこのような(...、PhoneNumberの1のために、名前1のために)多くの類似したコードブロックを持っている:searchstringが見つかったデータベース属性を確認します(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); 
     } 

答えて

1

あなたは同じ時間でよりよい解決策になり、よりコンパクトな方法でそれを書くことができますパフォーマンスの観点から、(あなたが全体のテーブルから1つだけのフィールドを選択するように):

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

同様にあなたがphoneNumberQueryを作成し、emailAddressQueryなど

次に、あなたが.Concat()のような単一のクエリにこのようなすべてのピースをすることができますこれは:

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

はまた、あなたが表現-道を行くと、特定のフィールドに基づいて選択クエリを生成します

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

のような方法を記述しますが、あなたの特定のケースでは、私はそれだけの価値はないと思うことができます。

+0

私はそれが私が探しているもの(私はまだスクリプトを何度も呼び出す必要があります)が正確であるかどうかはわかりませんが、それは私の解決策よりも良いようです。 – Petr

関連する問題