猿问

动态 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'

依赖项:


翻翻过去那场雪
浏览 138回答 1
1回答

慕尼黑8549860

您的“尝试动态查询”有两个问题:当转换为动态查询时,您混合了变量名称,因为i和j太相似。it是不明确的,因为有 2 个 lambda,因此它被解析为最里面 lambda 的参数。首先,我们将其重命名i为p(“产品名称”)和j(s“搜索”):var&nbsp;query&nbsp;=&nbsp;names.Where(p&nbsp;=>&nbsp;vars.Any(s&nbsp;=>&nbsp;p.Contains(s))).ToList();然后你可以直接将其转换为动态 Linq 表达式:// The type of vars needs to be IEnumerable<string> otherwise Dynamic Linq does not see .AnyIEnumerable<string> vars = new[] {"i", "a"};var query2 = names.Where("p => @0.Any(s => p.Contains(s))", vars).ToList();然后你可以将内部 lambda (s) 的参数替换为itvar&nbsp;query3&nbsp;=&nbsp;names.Where("p&nbsp;=>&nbsp;@0.Any(p.Contains(it))",&nbsp;vars).ToList();正如您所看到的,您混淆了 的对象和参数Contains。然后您可以应用 EF 查询的表达式。所以参数的用法p变成p.ProductName:IEnumerable<string>&nbsp;vars&nbsp;=&nbsp;new[]&nbsp;{"i",&nbsp;"a"}; query&nbsp;=&nbsp;query.Where("p&nbsp;=>&nbsp;@0.Any(p.ProductName.Contains(it))",&nbsp;vars).ToList();或者像这样:IEnumerable<string>&nbsp;vars&nbsp;=&nbsp;new[]&nbsp;{"i",&nbsp;"a"}; query&nbsp;=&nbsp;query.Where("p&nbsp;=>&nbsp;@0.Any(s&nbsp;=>&nbsp;p.ProductName.Contains(s))",&nbsp;vars).ToList();
随时随地看视频慕课网APP
我要回答