查询多个筛选选项的结构和语法

时间:2017-09-15 23:14:46

标签: c# entity-framework linq linq-to-entities

我有一个非常大的数据集。为了优化查询性能,我根据用户选择的过滤器进行查询。

ToString()

正如您所看到的,随着越来越多的过滤器选项被添加,这会变得非常烦人。有没有办法以这样的方式重构这些代码,使得查询仍然优化而不依赖于嵌套的if else语句?

1 个答案:

答案 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...方法。