1

这些值都来自下拉列表,可以为空,也可以不为空。需要编写一个无论任何参数值是否为空都可以工作的查询。.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();
        }
4

2 回答 2

3

您可以有条件地应用“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();
}
于 2012-05-12T16:45:08.713 回答
1

您始终可以在 where 子句中检查有效性

.Where(c => IsInvalidParam() || Check())

或者你的例子可能是

.Where(c => String.IsNullOrEmpty(Country) || c.RootCat.Name == Country)

或者看看Predicate。这可能导致类似于

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。

于 2012-05-12T15:35:19.977 回答