Tag: lambda

C#中multithreading的Lambda表达式

我试图理解为什么这个程序不起作用 预期输出:随机顺序的数字0-19运行时得到的结果:重复一些数字,有时打印20。 请帮忙。 我在DoSomething()中尝试使用lock(obj),但它没有帮助。 程序 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication2 { public delegate void callbackDelegate(int x); class Program { void processCallback(int x) { Console.WriteLine(“IN callback: The value I got is ” + x); } static void Main(string[] args) { Program p = new Program(); p.processinThreads(); Console.ReadKey(); } public […]

如何在Entity Framework Core中传递具有多个级别的lambda’include’?

我有一个存储库,可以获取’include’的lambda表达式。 public TEntity FirstOrDefault(Expression<Func> predicate, params Expression<Func>[] includePaths) { return Context.Set().Includes(includePaths).FirstOrDefault(predicate); } 在以前的EF版本中,我在服务层使用它,例如: var plan = _unitOfWork.PlanRepository .FirstOrDefault( p => p.Id == id, include => include.PlanSolutions.Select(ps => ps.Solution) ); 其中’PlanSolutions’是一个集合,’Solution’是一个嵌套在’PlanSolution’中的属性。 但现在这段代码出错了: InvalidOperationException:属性表达式’include => {来自[include]中的PlanSolutions ps。.PlanSolutions select [ps] .Solution}’无效。 表达式应表示属性访问:’t => t.MyProperty’。 有关包含相关数据的详细信息,请参阅http://go.microsoft.com/fwlink/?LinkID=746393 。 现在似乎我不能使用’Select’方法获得多个级别包含,但我也不能使用Microsoft建议的’ThenInclude’方法,因为查询本身位于存储库内部,服务没有访问。 有没有办法治愈它?

使用“中间洞”模式

我刚刚遇到了“中间的漏洞”模式,并且认为我可以使用它来删除一些重复的代码,特别是当我尝试对不同的方法进行基准测试并在每个方法之前和之后使用相同的代码时。 我能够使用下面的代码获得基础知识。 我从StartingMethod开始 ,其主要目标是调用MainMethod1和MainMethod2 ,但它是通过PrePostMethod实现的 。 我现在想知道的是如何传递参数并获得返回值。 任何帮助都会很棒。 谢谢。 代码: 公共静态类HoleInTheMiddle { public static void StartingMethod() { PrePostMethod(MainMethod1); PrePostMethod(MainMethod2); } public static void PrePostMethod(Action someMethod) { Debug.Print( “PRE”); 的someMethod(); Debug.Print( “邮报”); } public static void MainMethod1() { Debug.Print(“这是主要方法1”); } public static void MainMethod2() { Debug.Print(“这是主要方法2”); } }

转换表达式树

让它有: Expression<Func> exp1 = x => x.mesID == 1; Expression<Func> exp2 = x => x.mesID == 1; 现在我需要将exp1传递给_db.Messages.where(exp1); 问题是我只有exp2,我需要将类型转换为Message,所有属性都是一样的! 现在我这样做: var par = Expression.Parameter(typeof(Message)); var ex = (Expression<Func>)Expression.Lambda(exp2.Body, par); 问题是输入参数改变了是的! 但是lambda“x.mesID”正文中的x属于旧类型。 任何方式改变身体中的所有参数类型或改变输入参数,它反映身体呢? 我想这是我一直对LINQ的一个大问题,因为在层之间我不能传递生成的类,因为这将使层耦合,所以我必须制作轻量级类,现在我如何使用像_db.Messages这样的方法。哪里(); 从busiess层?!! 虽然busniess层对Message类型一无所知,但它只知道MessageDTO。

为lambda声明提供的参数数量不正确

请看一下我的代码:我正在尝试用表达式树创建myCar 。 我在这行上得到一个ArgumentException var m = Expression.Lambda<Func<Engine,…消息是为lambda声明提供的参数数量不正确 。 public class Engine { public string Name { get; private set; } public Engine(string name) { Name = name; } } public class Car { private readonly Engine engine; public Car(Engine engine) { this.engine = engine; } public string GetEngineName(){return engine.Name;} } class Program { static void […]

从linq表达式中提取方法名称

如何从C#中的表达式获取第一个方法的名称? 像下面虚构的MethodUtils.NameFromExpression()之类的东西: Expression<Action> expr = s => s.Trim(); Assert.AreEqual(“Trim”, MethodUtils.NameFromExpression(expr)); 理想情况下,任何util方法都将以这样一种方式编写/重载,即它可以为任何Action或Func委托类型提供表达式。 提前致谢。 UPDATE 我找到了答案(下面),但仍然想知道这是否是一个好的解决方案,或者是否已经存在在BCL中执行此操作的方法。

使用lambda表达式替换正则表达式匹配

我正在寻找一个简单的正则表达式查找和替换解决方案我可以提供一个lambda表达式来替换每个匹配。 例如: regex.MatchReplace(text, match => “replacement string”); 这样我就可以创建自己的逻辑来生成替换字符串,这可能涉及调用各种方法等,即你不能用替换模式做的事情。 谁知道我怎么能做到这一点?

在成员初始化程序中不能使用’this’吗?

这合法吗? 它是否包含隐藏的错误或缺陷? Visual Studio不会给出任何错误或警告,但ReSharper会: /// /// immutable tuple for two /// public class Pair : Singleton { public TValue2 Value2 { get; private set; } public Pair(TValue1 value1, TValue2 value2, Func<Pair, String> toStringFunc) : this(value1, value2, () => toStringFunc(this)) { } //Red light }2> : Singleton

从lambda表达式方法参数中获取结束值

基本上我想得到一个被调用方法的参数值,如下所示: var x = 1; var a = 2; var b = 3; Do(o => o.Save(x, “Jimmy”, a+b+5, Math.Sqrt(81))); public static void Do(Expression<Action> expression) where T : Controller { // get the values 1,Jimmy,10,9 here }

使用3个条件创建Lambda表达式

我想为此动态创建一个lambda表达式: (o => o.Year == year && o.CityCode == cityCode && o.Status == status) 我写这个: var body = Expression.AndAlso( Expression.Equal( Expression.PropertyOrField(param, “Year”), Expression.Constant(year) ), Expression.Equal( Expression.PropertyOrField(param, “CityCode”), Expression.Constant(cityCode) ) , Expression.Equal( Expression.PropertyOrField(param, “Status”), Expression.Constant(status) ) ); 但对于这段代码: Expression.Equal( Expression.PropertyOrField(param, “Status”), Expression.Constant(status) ) 我收到一个错误: 无法从’System.Linq.Expressions.BinaryExpression’转换为’System.Reflection.MethodInfo’ 我如何为lambda表达式添加3个条件?