c# - 多个值包含动态 Linq

标签 c# linq .net-core dynamic-linq

如何在 Dynamic Linq 中使用 Contain 的多值。

正常 Linq 预期:

using System;
using System.Linq;
public class Simple {
  public static void Main() {
    string[] names = { "Burke", "Laptop", "Computer", 
                       "Mobile", "Ahemed", "Sania", 
                       "Kungada", "David","United","Sinshia" };
      string[] vars = {"i","a"};
      var query = names.Where(i=> vars.Any(j=>i.Contains(j))).ToList();

      Console.WriteLine(query.Count);
  }
}

预期的 SQL

SELECT * FROM User WHERE (NAME LIKE '%a%'OR NAME LIKE '%b%')

尝试过动态 Linq:

query = query.Where("new[]{\"a\",\"c\"}.Any(i=>i.Contains(it.ProductName))");

返回异常:

No property or field 'ProductName' exists in type 'String'

依赖:

最佳答案

您的“尝试过的动态查询”有两个问题:

  1. 在转换为动态查询时,您混合了变量名称,因为 ij 太相似了。

  2. 是不明确的,因为有 2 个 lambda,所以它被解析为最里面的 lambda 的参数。

让我们首先将 i 重命名为 p(对于“产品名称”),将 j 重命名为 s(对于“搜索”):

var query = names.Where(p => vars.Any(s => p.Contains(s))).ToList();

然后您可以直接将其转换为动态 Linq 表达式:

// The type of vars needs to be IEnumerable<string> otherwise Dynamic Linq does not see .Any
IEnumerable<string> vars = new[] {"i", "a"};
var query2 = names.Where("p => @0.Any(s => p.Contains(s))", vars).ToList();

然后你可以用 it 替换 inner lambda (s) 的参数

var query3 = names.Where("p => @0.Any(p.Contains(it))", vars).ToList();

如您所见,您混淆了 Contains 的对象和参数。

然后您可以将表达式应用于 EF 查询。所以参数 p 的用法变成了 p.ProductName:

IEnumerable<string> vars = new[] {"i", "a"};
query = query.Where("p => @0.Any(p.ProductName.Contains(it))", vars).ToList();

或者像这样:

IEnumerable<string> vars = new[] {"i", "a"};
query = query.Where("p => @0.Any(s => p.ProductName.Contains(s))", vars).ToList();

关于c# - 多个值包含动态 Linq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57624006/

相关文章:

c# - C# : Does it sleep the thread the object was instantiated in, 中的 Thread.Sleep() 或我从中调用该方法的线程?

c# - Linq 从列表中的多个列表中选择值

c# - 无法使用已使用的键(LINQ)添加实体

c# - 使用 Linq 解析格式错误的 XML

c# - AutoFac/.NET Core - 注册 DBcontext

c# - MbDotNet Mountebank .Net 客户端抛出无法建立连接,因为目标机器主动拒绝它

c# - 如何在 .Net Core Web API 项目中对使用 Mapper 的方法进行单元测试

c# - 如何使用 C# EF Fluent api 为值对象成员创建索引

c# - LINQ 语句中的多个 OR 子句

c# - 在 Process 中调用 robocopy 的批处理脚本不会终止