2017-09-15 1 views
1

Ich habe einen sehr großen Datensatz. Um die Abfrageleistung zu optimieren, erstelle ich Abfragen basierend darauf, welche Filter ein Benutzer ausgewählt hat.Abfragestruktur und Syntax für mehrere Filteroptionen

using (_db) 
{ 
    if (string.IsNullOrEmpty(CompanyID)) 
    { 
     if (string.IsNullOrEmpty(HealthplanCode)) 
     { 
      foreach (string x in _db.BM_OPT_MASTER.Select(y => y.OPT).Distinct()) 
      { 
       currentComboBox.Items.Add(x); 
      } 
     } 
     else 
     { 
      foreach (string x in _db.BM_OPT_MASTER.Where(y => y.HPCODE == HealthplanCode).Select(y => y.OPT).Distinct()) 
      { 
       currentComboBox.Items.Add(x); 
      } 

     } 
    } 
    else 
    { 
     if (string.IsNullOrEmpty(HealthplanCode)) 
     { 
      foreach (string x in _db.BM_OPT_MASTER.Where(y => y.COMPANY_ID == CompanyID).Select(y => y.OPT).Distinct()) 
      { 
       currentComboBox.Items.Add(x); 
      } 

     } 
     else 
     { 
      foreach (string x in _db.BM_OPT_MASTER.Where(y => y.COMPANY_ID == CompanyID && y.HPCODE == HealthplanCode).Select(y => y.OPT).Distinct()) 
      { 
       currentComboBox.Items.Add(x); 
      } 
     } 
    } 
} 

Wie Sie sehen können, kann dies ziemlich ärgerlich werden, da immer mehr Filteroptionen hinzugefügt werden. Gibt es eine Möglichkeit, diesen Code so zu refactorisieren, dass die Abfrage immer noch optimiert wird, ohne auf verschachtelte if else-Anweisungen angewiesen zu sein?

Antwort

1

Sie könnten eine benutzerdefinierte Klasse mit "Abfrageoptionen" definieren, die Sie mit den gewünschten Parametern ausfüllen können. Es würde wie folgt aussehen:

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

Diese dann als solche verwendet werden können (ich war nicht sicher, was in BM_OPT_MASTER Ihre Artikel geben, so dass ich nur nahm das):

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;  
} 

Sie würden einfach anrufen die AddItems Funktionen mit dem, was Filterwerte Sie haben, zum Beispiel:

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

oder

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

Um neue Abfragefilteroptionen hinzuzufügen, fügen Sie einfach ein neues Feld zur QueryFilterOptions-Klasse hinzu und fügen eine FilterOn...-Methode hinzu.

Verwandte Themen