为了账号安全,请及时绑定邮箱和手机立即绑定

动态 Linq 包含多个值

动态 Linq 包含多个值

C#
翻翻过去那场雪 2023-09-16 20:05:41
如何在 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);  }}预期 SQLSELECT * 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'依赖项:.NET核心2.2实体框架核心 2.2.6System.Linq.Dynamic.Core 1.0.18 ( https://github.com/StefH/System.Linq.Dynamic.Core )
查看完整描述

1 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

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

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

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

首先,我们将其重命名ip(“产品名称”)和js“搜索”):

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();

然后你可以将内部 lambda (s) 的参数替换为it

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();


查看完整回答
反对 回复 2023-09-16
  • 1 回答
  • 0 关注
  • 137 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信