繁体   English   中英

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

[英]How to create dynamic lambda based Linq expression from a string in C#?

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

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

基本上,我需要转换这样的字符串:

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

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

这里提出了类似的问题:

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

据我了解,此“动态查询”实际上是一个框架,用于传递对Where子句的限制而无需使用lambda表达式。

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

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

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

var myLambda = x => x * x

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM