如何在C#中的字符串创建基于动态拉姆达LINQ表达式?(How to create dynamic

2019-06-23 13:44发布

我有一些困难,从创建一个基于字符串的λ-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>>

所以,它相当于下面的方法在哪里内部的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”)

Answer 1:

类似的问题在这里问:

有没有一种简单的方法来解析(lambda表达式)字符串到Action委托?

据我了解,这种“动态查询”实际上是在限制通过为Where子句不使用lambda表达式的框架。

那其意义在于lambda表达式不是动态的方法,它们是匿名方法。 如果你需要在装配一看,你会看到你的lambda表达式转换成关闭任何自由变量作为字段。 的类与你的匹配的签名,场变量在调用点分配的方法。

考虑这个问题的一个好方法是,它意味着你的lambda表达式是由C#编译器在编译时解释,而且变量被在运行时从这个类实例化对象解决。

为了证明这一点,考虑以下几点:

var myLambda = x => x * x

你会发现这是行不通的。 这是因为,以创建相关的类/方法,编译器必须知道,在编译时,x的类型。

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



文章来源: How to create dynamic lambda based Linq expression from a string in C#?