多个过滤器搜索没有多个选项-ASP.NET MVC
Posted
技术标签:
【中文标题】多个过滤器搜索没有多个选项-ASP.NET MVC【英文标题】:Multiple filter Searching without having multiple options -ASP.NET MVC 【发布时间】:2021-02-19 05:00:11 【问题描述】:[已编辑]
我正在使用带有 EF 6 的 ASP.NET MVC。 在显示有关客户姓名和客户地址的所有信息的网页上。现在我想根据客户名称或客户地址过滤记录。 以下是我在客户表和地址表中搜索 searchText 的逻辑,但它仍然仅按客户名称搜索。
public class Address
public int AdressID;
public string Street;
public string city;
public string Zip;
public class Customer
public int CustomerId;
public string CustomerName;
public string AdressId;
public int CustomerActive;
public virtual Address Address;
public virtual ICollection<Site> Sites;
这就是我在控制器中所做的。
public AllCustomerList GetCustomersV2WithFilterAsync(FilterQuery fr)
var searchText = GetFilterForSearchText(fr, FilterType.SearchText);
this.DatabaseContext.DisableLazyLoading();
var totalCount = 0;
var customerQuery = this.DatabaseContext.Customers.AsNoTracking().Where(p =>
p.customerActive.HasValue && p.customerActive.Value)
.Include(p => p.Address)
.Include(p => p.ExternalSystemCustomerIntegrations)
.Include(p => p.Address1)
if (!string.IsNullOrEmpty(searchText))
//This query will search the string in customer table
customerQuery = customerQuery.Where(c => c.customerName.Contains(searchText));
//In this following code section the searchtext will be queried for customer address and customer Name
// searching according to customer Adress
customerQuery = customerQuery.Where(c =>
c.Address.street.Contains(searchText)
|| c.Address.street2.Contains(searchText)
|| c.Address.city.Contains(searchText)
|| c.Address.County.Contains(searchText)
|| c.Address.zip.Contains(searchText)
);
customerQuery = customerQuery.OrderByDescending(p => p.customerID);
totalCount = customerQuery.Count();
var customers = customerQuery.GetPaginatedData(fr.Offset, fr.RecordSet, totalCount > 0).ToList();
【问题讨论】:
其实我什么都不懂…… 在给定的图片中,搜索框正在根据 Customer Name Only 进行搜索。与它一起,searchText 还应该在客户地址或站点地址中搜索。如果找到任何一个或两个,则应显示相应的客户地址和客户名称。 【参考方案1】:这里有几点需要注意。
当您构建 LINQ 查询时,在需要实现数据之前不会执行它。
在此之前,查询被保留为可以执行的表达式。
您可以通过多种方式强制执行查询,例如在查询结束时通过.ToList()
。
另一件事是,在您的代码中,您搜索地址详细信息的逻辑是在您的客户名称搜索之后。但重要的是,它只是添加到客户名称查询中。因此,从本质上讲,只有当搜索文本包含在客户的姓名和地址的一部分中时,您才能找到客户。
您可以通过多种方式绕过它。 或者,结合名称和地址查询:
if (!string.IsNullOrEmpty(searchText))
customerQuery =
customerQuery.Where(c => c.customerName.Contains(searchText)
|| c.Address.street.Contains(searchText)
|| c.Address.street2.Contains(searchText)
|| c.Address.city.Contains(searchText)
|| c.Address.County.Contains(searchText)
|| c.Address.zip.Contains(searchText));
或者生成两个单独的查询:
if (!string.IsNullOrEmpty(searchText))
var customerNameQuery =
customerQuery.Where(c => c.customerName.Contains(searchText));
var customerAddressQuery =
customerQuery.Where(c => c.Address.street.Contains(searchText)
|| c.Address.street2.Contains(searchText)
|| c.Address.city.Contains(searchText)
|| c.Address.County.Contains(searchText)
|| c.Address.zip.Contains(searchText));
// ... use the new queries ...
【讨论】:
"您搜索地址详细信息的逻辑是在您的客户名称搜索之后。但重要的是,它只是添加到客户名称查询中。所以本质上您只会在搜索文本包含在他们的姓名和地址的一部分。” :-Bascally 我想要一个可以给我结果的查询,如果 name 不包含 searchText 但地址包含它或 Vice-Versa 或两者兼而有之。我必须将其存储在查询中。 用我的第一个组合查询替换您的查询。 是的,它对我有用。感谢您的时间和我们的知识。以上是关于多个过滤器搜索没有多个选项-ASP.NET MVC的主要内容,如果未能解决你的问题,请参考以下文章
使用 C# 在 ASP.NET MVC 中使用多个参数过滤数据