Tag: lambda

如何使用多个条件构建Lambda表达式树

注意:我知道使用动态linq创建它很简单,但我想学习。 我想创建一个“找到”的lambda:Name = David AND Age = 10。 class Person { public int Age { get; set; } public string Name { get; set; } } var lambda = LabmdaExpression(“Name”, “David”, “Age”, 10); static Expression<Func> LabmdaExpression(string property1, string value1, string property2, int value2) { ParameterExpression parameterExpression = Expression.Parameter(typeof(Person), “o”); MemberExpression memberExpression1 = Expression.PropertyOrField(parameterExpression, property1); MemberExpression […]

Lambda Expression Compile()方法有什么作用?

我试图在C#中理解AST。 我想知道,这个例子中的Compile()方法到底是做什么的。 // Some code skipped Expression<Func> data = Expression.Lambda<Func>( Expression.Call(s, typeof(string).GetMethod(“Substring”, new Type[] { typeof(int), typeof(int) }), a, b), s, a, b ); Func fun = data.Compile(); 为了防止误解,我理解Expression.Lambda和Expression.Call构造。 我感兴趣的是Compile()方法。 它以某种方式产生真正的MSIL吗? 我能看到MSIL吗?

如何在不使用Invoke方法的情况下组合两个lambda表达式?

我有两个lambda表达式: Expression<Func> e1 = i=>i.FName.Contain(“john”); 和 Expression<Func> e2=i=>i.LName.Contain(“smith”); i类型,来自我的poco实体,不能与invoke一起使用。 我想在运行时结合这些。 我想在运行时以类似的方式组合这些表达式: Expression<Func> e3 = Combine(e1,e2);

C#Lambda表达式和NHibernate

我是NHibernate这个伟大世界的新手。 我使用的是2.0.1.GA版。 这是我的问题。 我有一个带有Manufacturer(nvarchar(50))和一个主键ID(int) 。 我的.NET类是: public class Car { public virtual int ID { get; set; } public virtual string Manufacturer { get; set; } } 现在,如果我想要检索梅赛德斯制造的所有汽车,我必须输入: using (var session = OpenSession()) { var cars = session .CreateCriteria(typeof(Car)) .Add(Restrictions.Like(“Manufacturer”, “Mercedes”)) .List(); // … } 我不喜欢这样的事实,我需要将属性名称指定为字符串:(是否可能有更多的重构友好(这只是一个建议)? var ms = session .CreateCriteria() .Add(c => c.Manufacturer, Restrictions.Like(“Mercedes”) […]

将此委托转换为匿名方法或lambda

我是所有匿名function的新手,需要一些帮助。 我得到以下工作: public void FakeSaveWithMessage(Transaction t) { t.Message = “I drink goats blood”; } public delegate void FakeSave(Transaction t); public void SampleTestFunction() { Expect.Call(delegate { _dao.Save(t); }).Do(new FakeSave(FakeSaveWithMessage)); } 但这完全是丑陋的,我想让Do的内部成为匿名方法,如果可能的话,甚至是lambda。 我试过了: Expect.Call(delegate { _dao.Save(t); }).Do(delegate(Transaction t2) { t2.Message = “I drink goats blood”; }); 和 Expect.Call(delegate { _dao.Save(t); }).Do(delegate { t.Message = “I drink goats […]

我应该在什么时候使用它们的函数

我似乎无法绕过他们。 据我所知,它是动态地向类添加逻辑。 框架内的课程是否为此准备好了? 我为什么要扩展类并在扩展中添加它的function。 我将在全球范围内访问,并且更容易维护。 我读过有4种函子类型: 比较器 关闭 谓语 变压器 我们应该处理它们中的每一个。 ps在vb中有类似的东西吗? 所以我可以说我认为lambda表达式是仿函数。 这为我清理了一些东西:)(呵呵) Lambda表达式是算子吗? 匿名函数是函子吗? 但我问了这个问题,因为我遇到了另一种类型的fucntors,即这些: delegate void FunctorDelegate(int value); class Addition { FunctorDelegate _delegate; public Addition AddDelegate(FunctorDelegate deleg) { _delegate += deleg; return this; } public int AddAllElements(IList list) { int runningTotal = 0; foreach( int value in list) { runningTotal += value; […]

使用LINQ ExpressionVisitor将基本参数替换为lambda表达式中的属性引用

我正在为我们系统的一部分编写数据层,该数据层记录有关每天运行的自动作业的信息 – 作业名称,运行时间,结果,等等。 我正在使用Entity Framework与数据库交谈,但我试图将这些细节隐藏在更高级别的模块之外,我不希望实体对象本身被暴露。 但是,我想使我的界面在用于查找工作信息的标准中非常灵活。 例如,用户界面应允许用户执行复杂的查询,例如“给我所有名为’hello’的作业,该作业在上午10:00到11:00之间运行失败。” 显然,这看起来像是动态构建的Expression树的工作。 所以我希望我的数据层(存储库)能够接受类型为Expression<Func> (lambda表达式)的LINQ表达式,然后在后台转换该lambda表达式,我的Entity Framework ObjectContext可以用作Where()子句中的filter。 简而言之,我正在尝试将Expression<Func>类型的lambda表达式转换为Expression<Func> ,其中svc_JobAudit是Entity Framework数据对象,对应于存储作业信息的表。 (第一个委托中的四个参数分别对应于作业名称,运行时间,结果以及分别在MS中花费的时间) 我使用ExpressionVisitor类取得了很好的进展,直到我碰到一堵砖墙并收到带有此错误消息的InvalidOperationException : 从“VisitLambda”调用时,重写“System.Linq.Expressions.ParameterExpression”类型的节点必须返回相同类型的非null值。 或者,覆盖“VisitLambda”并将其更改为不访问此类型的子项。 我完全不知所措。 为什么它不会允许我将引用参数的表达式节点转换为引用属性的节点? 还有另一种方法可以解决这个问题吗? 以下是一些示例代码: namespace ExpressionTest { class Program { static void Main(string[] args) { Expression<Func> expression = (myString, myDateTime, myResultCode, myTimeSpan) => myResultCode == ResultCode.Failed && myString == “hello”; var result = ConvertExpression(expression); } […]

C#方法可以返回一个方法吗?

C#中的方法可以返回一个方法吗? 例如,一个方法可以返回一个lambda表达式 ,但是我不知道我可以为这样的方法提供什么类型的参数,因为一个方法不是Type 。 这样的返回方法可以分配给某个委托。 以此概念为例: public QuadraticFunctionMaker(float a , float b , float c) { return (x) => { return a * x * x + b * x + c; }; } delegate float Function(float x); Function QuadraticFunction = QuadraticFunctionMaker(1f,4f,3f);

表达式<Func >到Expression <Action >“Getter”到“Setter”

我是表达式的新手,我想知道如何以任何方式转换我的表达式 让我们说在这个例子中我的TModel是Customer类型,并将它分配到这样的地方: Expression<Func> getvalueexpression = customer =>customer.Name 喜欢的东西 Expression<Action> setvalueexpression = [PSEUDOCODE] getvalueexpression = input Action Setter = setvalueexpression.Compile(); Setter(mycustomer,value); 所以简而言之,我想以某种方式构建和编译一个表达式,该表达式将我的getter表达式指定的客户名称设置为特定值。

使用reflection创建表达式<Func >

我使用Moq来创建数据集的模拟。 我创建了一个小助手类,它允许我有一个内存存储而不是数据库,使unit testing变得轻而易举。 这样我可以添加和删除我的模拟数据集中的项目,这允许我测试我的插入和删除服务调用。 在模拟的设置过程中,我有一行如下所示 this.Setup(i => i.AcademicCycles).Returns(mockStore.GetList()); 我的模拟有很多属性,所以我想使用reflection执行此设置步骤。 我已经设法通过reflection工作的Returns部分,但我坚持使用lambda方法来Setup 。 Setup需要一个 Expression<Func<GoalsModelUnitOfWork, IQueryable>>对应于i => i.AcademicCycles 我想动态创建它。 使用reflection我有以下内容: 物业名称:“AcademicCycles” 类型IQueryable 类型AcademicCycle 我还在lambda语句中有一个i的实例,它是一个GoalsModelUnitOfWork