使用多个筛选值筛选数据

本文关键字:筛选 数据 | 更新日期: 2023-09-27 18:09:04

大家好,

我目前正在做一个项目,它给了我一些麻烦,通过使用多个过滤值从数据库中过滤数据。在选择过滤器并单击按钮后,过滤器将发生。

我有5个过滤器:地区、公司、价格和2个布尔值
请注意,区域和公司是带有复选框的特殊下拉列表,这意味着用户可以选择一个或多个地区和公司名称。

我已经做了一些测试,并提出了一个不完整的代码,工作一点,但不是我喜欢的。

当我的一个过滤器为NULL或空时,就会出现问题。我真不知道该怎么处理这事。我想到的唯一方法是使用一堆IF ELSE语句,但我开始认为这将永远不会结束,因为有这么多的可能性…

我确信有一个更简单的方法来做到这一点,而不使用一堆IF ELSE语句,但我真的不知道如何做到这一点。如果有人能指引我正确的方向,我将不胜感激。由于

这是我现在所拥有的(我现在还没有将价格添加到查询中):

protected void filterRepeater(List<int> regionIDs, string[] companyArray,
    string blocFiltValue, bool bMutFunds, bool bFinancing)
{
    DatabaseEntities db = new DatabaseEntities();
    PagedDataSource pagedDsource = new PagedDataSource();
    IQueryable<Blocs> query = (from q in db.Blocs
                               where q.isActive == true
                               orderby q.date descending
                               select q);
    IQueryable<Blocs> queryResult = null;
    //if some filters are NULL or Empty, it create a null queryResult
    queryResult = query.Where(p => companyArray.Contains(p.company) &&
                                   regionIDs.Contains((int)p.fkRegionID) &&
                                   (bool)p.mutual_funds == bMutFunds &&
                                   (bool)p.financing == bFinancing);
    if (queryResult.Count() > 0)
    {
        //Bind new data to repeater
        pagedDsource.DataSource = queryResult.ToArray();
        blocRepeater.DataSource = pagedDsource;
        blocRepeater.DataBind();
    }
}

使用多个筛选值筛选数据

仅将相关过滤器添加到query:

IQueryable<Blocs> query =
    from q in db.Blocs
    where q.isActive == true
    orderby q.date descending
    select q;
if (companyArray != null)
{
    query = query.Where(p => companyArray.Contains(p.company));
}
if (regionIDs != null)
{
     query = query.Where(p => regionIDs.Contains((int)p.fkRegionID));
}
// ...
// etc
// ...
if (query.Any()) // Any() is more efficient than Count()
{
    //Bind new data to repeater
    pagedDsource.DataSource = query.ToArray();
    blocRepeater.DataSource = pagedDsource;
    blocRepeater.DataBind();
}

如果您只想通过非null或空的筛选值进行筛选,那么您可以通过逐个附加where子句来构建查询:

if(companyArray != null && companyArray.Length > 0) {
    query = query.Where(p => companyArray.Contains(p.company));
}
if(regionIDs!= null && regionIDs.Length > 0) {
    query = query.Where(p => regionIDs.Contains((int)p.fkRegionID));
}
if (!String.IsNullOrEmpty(blocFiltValue)) {
    query = query.Where(p => p.Block == blocFiltValue);
}

如果需要过滤,也可以为值类型使用可空值

bool? bMutFunds = ...; // Possible values: null, false, true.
...
if(bMutFunds.HasValue) {
    query = query.Where(p => (bool)p.mutual_funds == bMutFunds.Value); 
}

也许您可以为SQL语句创建一个字符串,并动态地添加部分到这个句子中,例如,如果选择或检查了某些内容,您可以在用户完成选择时向该字符串添加一些内容,您可以执行此SQL语句

相关文章: