gpt4 book ai didi

c# - 多个值包含动态 Linq

转载 作者:行者123 更新时间:2023-12-05 02:59:45 25 4
gpt4 key购买 nike

如何在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com