如何最好地处理包含 0 到 3 个参数/筛选器但使用单个 LinQ 到实体表达式的搜索查询
本文关键字:LinQ 单个 实体 查询 搜索 表达式 筛选 包含 处理 何最好 参数 | 更新日期: 2023-09-27 18:33:54
这些值都来自下拉列表,可以为空,也可以不为空。需要编写一个无论是否有任何参数都可以工作的查询值是否为空。仅当所有参数时,以下内容才有效/返回结果具有值,并且分别.Where
语句的所有语句都为真。我正在考虑一些通配符正则表达式来指定允许空参数匹配任何内容。因此,参数越多,搜索精度越高,但如果只提供一些参数或没有参数,则仍然有效。
public ActionResult GetResults(string age, string ProgType, string Country)
{
var results = _db.Categories
.Where(c => c.CatSchema.TypeName == "Programs")
.Where(c => c.FilterValToCatMaps.Any(fm => fm.FilterValue.Value == age))
.Where(c => c.FilterValToCatMaps.Any(fm => fm.FilterValue.Value == ProgType))
.Where(c => c.RootCat.Name == Country)
.Select(c => c.RootCat);
return View();
}
您可以有条件地应用 "Where" 子句 - 如下所示:
public ActionResult GetResults(string age, string ProgType, string Country)
{
var query = _db.Categories
.Where(c => c.CatSchema.TypeName == "Programs");
if (String.IsNullOrWhiteSpace(age) == false)
{
query = query
.Where(c => c.FilterValToCatMaps.Any(fm => fm.FilterValue.Value == age));
}
if (String.IsNullOrWhiteSpace(ProgType) == false)
{
query = query
.Where(c => c.FilterValToCatMaps.Any(fm => fm.FilterValue.Value == ProgType));
}
if (String.IsNullOrWhiteSpace(Country) == false)
{
query = query
.Where(c => c.RootCat.Name == Country);
}
var result = query
.Select(c => c.RootCat);
return View();
}
您可以随时在 where 子句中检查有效性
.Where(c => IsInvalidParam() || Check())
或者您案例中的一个例子可能是
.Where(c => String.IsNullOrEmpty(Country) || c.RootCat.Name == Country)
交替地看看谓词。这可能会导致类似于
public ActionResult GetResults(List<Predicate<CTYPE>> predicates)
{
var results = _db.Categories
.Where(c => predicates.All(pred => pred(c)))
.Select(c => c.RootCat);
return View();
}
在这里,您只需要在列表中包含有效的谓词,或者让谓词本身检查其输入的有效性,如果无法过滤,则返回 true。