使用多个筛选值筛选数据
本文关键字:筛选 数据 | 更新日期: 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语句