我有一个非常大的数据集。为了优化查询性能,我根据用户选择的过滤器进行查询。
ToString()
正如您所看到的,随着越来越多的过滤器选项被添加,这会变得非常烦人。有没有办法以这样的方式重构这些代码,使得查询仍然优化而不依赖于嵌套的if else语句?
答案 0 :(得分: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...
方法。