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

标签 c# linq lambda expression-trees dynamic-linq

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

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

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

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

进入谓词/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”)

最佳答案

这里问了一个类似的问题:

Is there an easy way to parse a (lambda expression) string into an Action delegate?

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

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

考虑这一点的一个好方法是,它暗示您的 lambda 表达式在编译时由 c# 编译器解释,并且通过在运行时实例化此类中的对象来解析变量。

为了证明这一点,请考虑以下内容:

var myLambda = x => x * x

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

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

关于c# - 如何从 C# 中的字符串创建基于动态 lambda 的 Linq 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10114841/

相关文章:

c# mvc 从字符串名称动态创建 Controller - eval?

c# - 使用 LINQ 查询获取包含当前列表中任何数值的新列表

python - 想要创建文件时 Lambda 和 S3 权限被拒绝

javascript - .NET Core 对象 JSON 序列化为 Javascript 格式

c# - Bing map WPF 控件处于离线模式 (MercatorMode)

c# - 应用重启后首次初始​​化 Membership.Provider 时出错

c# - 将多个控件数据绑定(bind)到单个 LINQ 查询

c# - 您可以在自己的初始化行中使用变量(字典中的 tryGetOrElse)吗?

java - 功能和消费者限制

Java lambda LinkedBlockingQueue 意外行为