C# 嵌套数组上的动态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”中不存在属性或

我想在包含字符串[]数组的集合中执行动态Lambda:

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中对对象执行的操作越多,就越容易。