如何在ASP.NET Core MVC控制器中使用搜索参数对对象列表进行筛选?

编程语言 2026-07-09

我正在用ASP.NET Core MVC构建一个食谱应用。我有一个 RecipeService,它从外部API返回一组食谱。我想实现一个搜索功能,让用户可以按名称筛选食谱。

我在控制器中有以下代码,但我不确定在Web应用程序中使用 StringComparison.OrdinalIgnoreCase 是否是最佳实践,或者是否有更高效的方式来处理为null或为空的搜索字符串。

public async Task<ActionResult> Index(string? search)
{
    Console.WriteLine("this is search: " + search);
    var recipes = await _recipeService.GetRecipesAsync();

    if (!string.IsNullOrWhiteSpace(search))
    {
        recipes = recipes.Where(r => r.strMeal.Contains(search, StringComparison.OrdinalIgnoreCase)).ToList();
    }

    return View(recipes);
}

解决方案

这里没有单一的正确答案。

如果你现有的代码能工作,那么本身并没有问题。不过,食谱的数量确实很关键。

看来你的代码会把整个食谱集合加载到内存中,然后在服务器端进行过滤。

考虑使用 Entity framework查询,它将生成SQL语句,在数据库端对数据进行过滤,而不是在服务器的内存中进行。

对于一个小型/试验性项目来说,这样做是可以的。

现实世界的应用通常会使用Entity Framework查询或存储过程,这样服务器只需要处理经过过滤的查询结果,而不是某个表中的每条记录。

关于处理空字符串或null的搜索查询,现有做法是可以的。

把搜索看作是在增加额外的筛选条件。

如果你没有指定食谱名称,就不要按名称进行过滤。

缺失的搜索条件并不一定是错误;它们只是表示“不要基于此条件筛选结果”。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章