C# 使用动态Linq包含多个值
如何在动态Linq中使用包含多个值 正常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
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())
?