如何最好地处理包含 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();
        }

如何最好地处理包含 0 到 3 个参数/筛选器但使用单个 LinQ 到实体表达式的搜索查询

您可以有条件地应用 "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。