gpt4 book ai didi

c# - 在 where() 方法上使用 for 循环

转载 作者:行者123 更新时间:2023-12-04 08:40:54 31 4
gpt4 key购买 nike

所以我有一个搜索输入和复选框,可以在有输入时将值传递给 Controller ​​。我想使用这些值从数据库中取回一些东西。搜索输入是一个字符串,它工作正常。这是搜索输入的代码:

public async Task<ViewResult> Index(string searchString, List<int> checkedTypes)
{
var products = from p in _db.Products select p;

ViewData["CurrentFilter"] = searchString;

if (!string.IsNullOrEmpty(searchString))
{
products = products.Where(p => p.Name.ToLower().Contains(searchString));
}

return View(products);
}
但是,复选框值存储在列表中。所以基本上我想做与上面的代码相同的事情,但是有一个列表。所以基本上一个想法是这样的:
if(checkedTypes != null)
{
foreach (var i in checkedTypes)
{
products = products.Where(p => p.TypeId == i));
}
}
如果我像上面的代码那样做,我只会从循环中获得最后一个 (i)。我做的另一个解决方案是:
if(checkedTypes != null)
{
var temp = new List<Product>();

foreach (var i in checkedTypes)
{
temp.AddRange(products.Where(p => p.TypeId == i));
}
products = temp.AsQueryable();
}
但是当我这样做时,我收到了这个错误:

InvalidOperationException: The provider for the source IQueryable doesn't implement IAsyncQueryProvider. Only providers that implement IAsyncQueryProvider can be used for Entity Framework asynchronous operations.


所以有人有我可以使用的解决方案吗?或者有没有更好的方法来处理 Controller 中的复选框?

最佳答案

假设您使用的是 EF Core(对于 linq2db 也是如此)-它支持使用本地集合进行翻译过滤,即 Where(x => checkedTypes.Contains(x.SomeId)) .
如果您有“和”逻辑来过滤 searchStringcheckedTypes比您可以有条件地添加 Where条款:

  if (!string.IsNullOrEmpty(searchString))
{
products = products.Where(p => p.Name.ToLower().Contains(searchString));
}

if(checkedTypes != null)
{
products = products.Where(p => checkedTypes.Contains(p.TypeId));
}
附言
此外,您应该能够将第一行更改为:
var products = _db.Products.AsQueryable();

关于c# - 在 where() 方法上使用 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64571214/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com