首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C#中从字符串创建基于动态lambda的Linq表达式?

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

Stack Overflow用户
提问于 2012-04-12 06:24:01
回答 1查看 10K关注 0票数 2

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

代码语言:javascript
运行
复制
public class MockClass
{
    public string CreateBy { get; set; }
}

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

代码语言:javascript
运行
复制
string stringToConvert = “x => x.CreateBy.Equals(filter.Value, StringComparison.OrdinalIgnoreCase”;

转换为to谓词/linq表达式:

代码语言:javascript
运行
复制
System.Linq.Expressions.Expression<Func<T, bool>>  or in this example 
System.Linq.Expressions.Expression<Func<MockClass, bool>>

因此,它相当于以下Where方法内部的Linq表达式:

代码语言:javascript
运行
复制
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”)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-12 07:32:19

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

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

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

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

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

要演示这一点,请考虑以下内容:

代码语言:javascript
运行
复制
var myLambda = x => x * x

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10114841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档