【问题标题】:EF Core With Dynamic Where and ForEach具有动态 Where 和 ForEach 的 EF Core
【发布时间】:2021-10-08 04:54:05
【问题描述】:

我有一个带有字符串/varchar 属性的表。

我的方法接受一个字符串,可以是逗号分隔的列表。

我的目标是构建一个动态的 where 子句,它将遍历逗号分隔的列表并使用我的查询创建一个 where 子句,但我的语法不正确。

public async List<DataObj> GetData(string pets)
{
   IQueryable<DataObj> query = dbSet;
   if (!string.IsNullOrEmpty(pets))
   {
       var split = pets.Split(",");
       foreach (var t in split)
       {
          query = query.Where(x => x.Pets.Contains(t.Trim()));
       }
    }
    return await query.DataObj.AsNoTracking().ToListAsync();
}

因此,如果一条记录的 DataObj.Pets 是“狗,猫”。而 DataObj.Pets 的另一条记录是:“狗,鸟”。

如果我输入“birds”作为 repo 的参数,它应该返回 DataObj2,如果我输入“dog”,它应该返回两者,如果我输入“dog,birds”,查询应该返回两者DataObj1 和 DataObj2。

我的查询有什么问题吗,因为它没有这样做。

【问题讨论】:

标签: entity-framework linq entity-framework-core


【解决方案1】:

如果我将“birds”作为 repo 的参数,它应该返回 DataObj2,如果我输入“狗”,它应该返回两者,如果我输入 “狗,鸟”查询应返回 DataObj1 和 DataObj2。

您的要求是Or 条件,通过链接您正在使用And 条件的Where 表达式

您可以使用谓词构建器或动态 LINQ 构建多个 Or 条件。

只是为了好玩-您可以使用异步方法

public async Task<List<DataObj>> GetData(string pets)
{
   if (string.IsNullOrEmpty(pets)) return new List<DataObj>();

   var tasks = pets.Split(",")
     .Select(p => context.DataObects.Where(o => o.Pets.Contains(p)).ToListAsync())
     .ToArray();

   await Task.WhenAll(tasks);

   return tasks.SelectMany(t => t.Result).ToList();
}

【讨论】:

  • PredicateBuilder 是我正在寻找的,谢谢!
猜你喜欢
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-22
相关资源
最近更新 更多