C# 嵌套数组上的动态Lambda条件
我想在包含字符串[]数组的集合中执行动态Lambda:C# 嵌套数组上的动态Lambda条件,c#,linq,lambda,dynamic-linq,C#,Linq,Lambda,Dynamic Linq,我想在包含字符串[]数组的集合中执行动态Lambda: public class ClassStudentsViewModel { public string[] Disciplines { get; set; } public TeacherName { get; set; } } 这就是我正在尝试的: source是ClassStudentsViewModel的集合,value是一个包含一个字符串的字符串数组。执行时,它会抛出以下异常: 类型“String”中不存在属性或
public class ClassStudentsViewModel
{
public string[] Disciplines { get; set; }
public TeacherName { get; set; }
}
这就是我正在尝试的:
source
是ClassStudentsViewModel
的集合,value
是一个包含一个字符串的字符串数组。执行时,它会抛出以下异常:
类型“String”中不存在属性或字段“y”
经过一些搜索,我发现这几乎是相同的问题,OP结束了对Dynamic.cs源代码的更改,这对我来说不是一个好的选择。我想知道我正在尝试的东西不受支持,或者可能是一个bug。问题是,上述问题几乎是4年前提出的
以下代码段很好地工作:
classStudents.AsQueryable().Where(x => x.Disciplines.Any(y => y == "Turma 2")).ToList();
我怎样才能摆脱那个错误呢
更新:
我尝试的一个小背景:我的控制器接收一个viewModel,其中包含由第三方网格发送的过滤器集合,基本上包含一个值和一个运算符,如eq
,gt
等。。。方法在lambda运算符上循环所有这些过滤器和变换,如eq
到=
或contains
到.contains()
。在一个简单的字符串属性中,如TeacherName
(上面更新的viewModel),动态过滤器可以工作,例如,如果屏幕截图中的谓词是:“TeacherName.Contains(@0)”
,则它可以正常工作
更新2:
此代码生成谓词:
public static string ToLambdaOperator(string field, string oper, int index, string sufix = null)
{
var result = String.Empty;
switch (oper)
{
case "eq":
case "neq":
case "gte":
case "gt":
case "lte":
case "lt":
result = string.Format(field + ToLinqOperator(oper) + "@" + index);
break;
case "startswith":
result = field + ".StartsWith(" + "@" + index + ")";
break;
case "endswith":
result = field + ".EndsWith(" + "@" + index + ")";
break;
case "contains":
result = field + ".Contains(" + "@" + index + ")";
break;
case "doesnotcontain":
result = "!" + field + ".Contains(" + "@" + index + ") || " + field + ".Equals(String.Empty)";
break;
}
if (!String.IsNullOrEmpty(sufix))
{
result += sufix;
}
return result;
}
// Use example
var operator = "eq";
var paramCounter = -1;
var predicate = ToLambdaOperator("Disciplines.Any(y => y", operator, ++paramCounter, ")");
上面的谓词将产生:规程.Any(y=>y=@0)
。使用操作符contains
将产生以下结果:规程。任何(y=>y.contains(@0))
我认为您尝试的是根据提供的参数生成表达式树。下面是一些关于如何做到这一点的例子
现在还不清楚为什么需要在这里使用动态LINQ。在你的情况下,什么是动态的?@JonSkeet我在外部构建了一个表达式,用于过滤第三方网格小部件。这不是一个非常清晰的描述-它没有给我们更多的上下文。您能否使用普通LINQ to对象执行这部分查询,然后将其用作小部件集成的动态LINQ源?@JonSkeet我正在尝试在不发布数百行的情况下包含所有相关信息。我已经更新了,我希望它能澄清这个问题。顺便说一句,我链接的问题在不同的解释中有相同的问题。如果您已经在编写代码来分别处理每个运算符,我不明白您为什么要使用动态LINQ-我只是将每个运算符转换为相关类型的Func
。。。在“普通”LINQ中对对象执行的操作越多,就越容易。