动态 Linq 包含多个值 [英] Multiple Values Contains with Dynamic Linq

查看:31
本文介绍了动态 Linq 包含多个值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How to use Multiple value with Contain in Dynamic 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'

依赖:

推荐答案

您的尝试动态查询"有两个问题:

There are two issues with your "tried dynamic query":

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

it 有歧义,因为有 2 个 lambda,因此它被解析为最内层 lambda 的参数.

it is ambigous as there are 2 lambdas and so it is parsed as a parameter of the innermost lambda.

让我们首先将 i 重命名为 p(对于产品名称")和 js(对于搜索"):

Let's first rename i to p (for "product names") and j to s (for "search"):

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

然后你可以直接把它转换成一个动态的 Linq 表达式:

Then you can directly transform this to a dynamic Linq expression:

// 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

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

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

As you can see you mixed up the object and argument of Contains.

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

Then you can apply the expression the EF query. So usage of argument p becomes 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();

这篇关于动态 Linq 包含多个值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆