如何在 C# 中从字符串创建基于 lambda 的动态 Linq 表达式

本文关键字:lambda 动态 表达式 Linq 创建 字符串 | 更新日期: 2023-09-27 18:30:44

我在从字符串创建基于 Lambda 的 Linq 表达式时遇到了一些困难。 这是我使用此示例对象/类的基本情况:

public class MockClass
{
    public string CreateBy { get; set; }
}

基本上我需要像这样转换一个字符串:

string stringToConvert = “x => x.CreateBy.Equals(filter.Value, StringComparison.OrdinalIgnoreCase”;

进入 to 谓词/linq 表达式:

System.Linq.Expressions.Expression<Func<T, bool>>  or in this example 
System.Linq.Expressions.Expression<Func<MockClass, bool>>

因此,它等效于以下 Where 方法中的 Linq 表达式:

query = query.Where(x => x.CreateBy.Equals(filter.Value,
StringComparison.OrdinalIgnoreCase));

我尝试使用以下帮助程序,但似乎无法弄清楚如何在我希望能够从事先不知道的字符串构建 linq 表达式的情况下让它们工作:http://www.albahari.com/nutshell/predicatebuilder.aspx

http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx(它现在作为NuGet包提供,也称为"DynamicQuery")

如何在 C# 中从字符串创建基于 lambda 的动态 Linq 表达式

这里也提出了一个类似的问题:

有没有一种简单的方法可以将(lambda 表达式)字符串解析为操作委托?

据我了解,这个"动态查询"实际上是一个框架,用于在不使用 lambda 表达式的情况下为 Where 子句传递限制。

这样做的意义在于lambda表达式不是动态方法,它们是匿名方法。如果你看过一个程序集,你会发现你的lambda表达式被转换为闭包,任何自由变量作为字段。该类有一个方法,其签名与您的签名匹配,字段变量在调用时分配。

考虑

这个问题的一个好方法是,它意味着 lambda 表达式在编译时由 c# 编译器解释,变量通过在运行时实例化此类中的对象来解析。

要演示这一点,请考虑以下事项:

var myLambda = x => x * x

您会注意到这不起作用。这是因为,为了创建相关的类/方法,编译器必须在编译时知道 x 的类型。

所有这些都很重要,因为 lambda 表达式的概念在运行时在 CLR 中不存在(与代码中的形式相同)。看起来像 lambda 表达式的字符串正是这样...