2017-09-15 3 views
1

私は非常に大きなデータセットを持っています。クエリのパフォーマンスを最適化するために、ユーザーが選択したフィルタに基づいてクエリを作成しています。複数のフィルタリングオプションのクエリ構造と構文

ご覧のとおり、フィルタオプションが追加されるにつれて、これはかなり迷惑になることがあります。このコードをリファクタリングして、ネストされたif elseステートメントに依存することなくクエリが最適化されるような方法はありますか?

答えて

1

「クエリオプション」を使用してカスタムクラスを定義することで、必要なパラメータを指定できます。

public class QueryFilterOptions 
{ 
    public string CompanyID { get; set; } 
    public string HealthplanCode { get; set; } 
    public string SomeOtherQueryOption { get; set; } 
} 

これは、その後、そのまま使用することができます(私はBM_OPT_MASTERであなたの項目を入力する内容が不明だったので、私はちょうどそれを取っている):それは次のようになります

あなただけ呼ぶだろう
public void AddItems(QueryFilterOptions options = null) { 
    using (_db) 
    { 
     if (options == null) { 
      options = new QueryFilterOptions(); 
     } 

     var items = _db.BM_OPT_MASTER; 

     items = FilterOnCompanyID(items, options.CompanyID); 
     items = FilterOnHealthPlanCode(items, options.HealthplanCode); 
     items = FilterOnSomeOtherQueryOption(items, options.SomeOtherQueryOption); 
     //...other filters 

     items = items.Select(y => y.OPT).Distinct(); 

     foreach (var item in items) 
     { 
      currentComboBox.Items.Add(item); 
     } 
    } 
} 

private IQueryable<BM_OPT_MASTER> FilterOnCompanyID(IQueryable<BM_OPT_MASTER> items, string companyID) 
{ 
    if (!(string.IsNullOrEmpty(companyID))) 
    { 
     items = items.Where(y => y.COMPANY_ID == companyID); 
    } 

    return items; 
} 

private IQueryable<BM_OPT_MASTER> FilterOnHealthPlanCode(IQueryable<BM_OPT_MASTER> items, string healthplanCode) 
{ 
    if (!(string.IsNullOrEmpty(healthplanCode))) 
    { 
     items = items.Where(y => y.HPCODE == healthplanCode); 
    } 

    return items; 
} 

private IQueryable<BM_OPT_MASTER> FilterOnSomeOtherQueryOption(IQueryable<BM_OPT_MASTER> items, string someOtherQueryOption) 
{ 
    if (!(string.IsNullOrEmpty(someOtherQueryOption))) 
    { 
     items = items.Where(y => y.SOME_OTHER_QUERY_OPTION == someOtherQueryOption); 
    } 

    return items;  
} 

例えば、あなたが持っているものは何でも、フィルタ値がAddItems機能、:

AddItems(new QueryFilterOptions 
{ 
    CompanyID = "SOME-COMPANY-ID" 
}); 

または

AddItems(new QueryFilterOptions 
{ 
    HealthplanCode = "SOME-HEALTHPLAN-CODE", 
    SomeOtherQueryOption = "SOME-OTHER-QUERY-OPTION" 
}); 

新しいクエリフィルタオプションを追加するには、QueryFilterOptionsクラスに新しいフィールドを追加し、FilterOn...メソッドを追加するだけです。

関連する問題