Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用动态Linq包含多个值_C#_Linq_.net Core_Dynamic Linq - Fatal编程技术网

C# 使用动态Linq包含多个值

C# 使用动态Linq包含多个值,c#,linq,.net-core,dynamic-linq,C#,Linq,.net Core,Dynamic Linq,如何在动态Linq中使用包含多个值 正常Linq时应为: using System; using System.Linq; public class Simple { public static void Main() { string[] names = { "Burke", "Laptop", "Computer", "Mobile", "Ahemed", "Sania", "Kung

如何在动态Linq中使用包含多个值

正常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'
返回异常:

query = query.Where("new[]{\"a\",\"c\"}.Any(i=>i.Contains(it.ProductName))");
No property or field 'ProductName' exists in type 'String'
从属关系:

  • .NET核心2.2
  • EntityFramework核心2.2.6
  • System.Linq.Dynamic.Core 1.0.18 ()

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

  • 在转换为动态查询时,您混合了变量名,因为
    i
    j
    太相似了

  • 它是模糊的,因为有2个lambda,所以它被解析为最内层lambda的参数

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

    然后可以直接将其转换为动态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();
    
    正如您所看到的,您混淆了
    包含的对象和参数

    然后可以将表达式应用于EF查询。因此,参数
    p
    的用法变为
    p.ProductName

    IEnumerable<string> vars = new[] {"i", "a"};
    query = query.Where("p => @0.Any(p.ProductName.Contains(it))", vars).ToList();
    
    IEnumerable 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();
    
    IEnumerable vars=new[]{“i”,“a”};
    query=query.Where(“p=>@0.Any(s=>p.ProductName.Contains(s))”,vars.ToList();
    
    它能工作吗
    i=>i.Contains(vars.Any())