Tag: 表达式

如何将OrderBy表达式数组传递给方法?

我正在尝试增强我的存储库,因此它是负责订购的人。 我已经应用了这个问题的答案,就存储库而言,我很确定它已经完成了。 我遇到的问题是我不知道如何将数组传递给存储库中的方法。 编译器不停地向我大吼大叫代表们。 在上面的链接问题中,作者基本上是在做我想要的,所以它必须是可能的。 这是我的存储库代码: public virtual IList SelectOrderedList( Expression<Func>[] Orderers, bool Ascending = true) { IOrderedQueryable TemporaryQueryable = null; foreach (Expression<Func> Orderer in Orderers) { if (TemporaryQueryable == null) { TemporaryQueryable = (Ascending ? this.ObjectSet.OrderBy(Orderer) : this.ObjectSet.OrderByDescending(Orderer)); } else { TemporaryQueryable = (Ascending ? TemporaryQueryable.ThenBy(Orderer) : TemporaryQueryable.ThenByDescending(Orderer)); }; }; return TemporaryQueryable.ToList(); } 另外,我并不是100%确定我应该使用Expression<Func> […]

为什么lambda表达式没有“实习”?

字符串是引用类型,但它们是不可变的。 这允许它们被编译器实现; 在出现相同的字符串文字的地方,可以引用相同的对象。 委托也是不可变的引用类型。 (使用+=运算符向多播委托添加方法构成赋值 ;这不是可变性。)而且,就像字符串一样,有一种“文字”方式来表示代码中的委托,使用lambda表达式,例如: Func func = () => 5; 该语句的右侧是一个类型为Func的表达式; 但我没有在任何地方显式调用Func构造函数(也不会发生隐式转换)。 所以我认为这基本上是一个文字 。 我在这里误解了我对“文字”的定义吗? 无论如何,这是我的问题。 如果我有两个变量,比如Func类型,我将两个相同的lambda表达式分配给: Func x = () => 5; Func y = () => 5; …什么阻止编译器将它们视为相同的Func对象? 我问,因为C#4.0语言规范的第6.5.1节明确指出: 将具有相同(可能为空)的捕获的外部变量实例集的语义相同的匿名函数转换为相同的委托类型是允许(但不是必需的)返回相同的委托实例。 这里使用语义相同的术语来表示在所有情况下,在给定相同参数的情况下,匿名函数的执行将产生相同的效果。 当我读到它时,这让我感到惊讶; 如果明确允许这种行为,我希望它能够实现。 但似乎并非如此。 事实上,这已经让很多开发人员陷入困境,尤其是 当lambda表达式用于成功附加事件处理程序而不能删除它们时。 例如: class EventSender { public event EventHandler Event; public void Send() { EventHandler handler = […]

如何在C#中解析数学表达式?

可能重复: .NET中是否有字符串数学计算器? C#可以将数学表达式(如y = 3 * x + 3)解析为字符串吗? 如果是的话,好吗? 我感谢您的帮助。

编译Expression 时,是否隐式缓存?

编译Expression ,框架是否隐式缓存了生成的代码? 我正在考虑静态正则Regex方法,其中框架隐式编译并缓存最后几个正则表达式。 如果编译的Expression对象没有被缓存,你是否可以推荐一些最佳实践来保持编译时间或任何可能导致问题的陷阱如果我手动缓存表达式? public MyResultType DoSomething(int arg1, int arg2) { var result = invokeHandler( (IDoSomethingHandler h) => h.DoSomething(arg1, arg2) ); return result; } private TResult invokeHandler(Expression<Func> action) where T : class { // Here, I might want to check to see if action is already cached. var compiledAction = action.Compile(); var methodCallExpr = action […]

如何在不使用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);

表达式<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

为什么从表达式<Func >创建的Func 比直接声明的Func 慢?

为什么通过.Compile()从Expression<Func>创建的Func比使用直接声明的Func慢得多? 我刚刚使用Func直接声明为在我正在处理的应用程序中使用Expression<Func>创建的Expression<Func> ,我注意到性能下降了。 我刚做了一点测试,从Expression创建的Func占用了Func直接声明的时间的“几乎”。 在我的机器上,Direct Func大约需要7.5秒,而Expression<Func>大约需要12.6秒。 这是我使用的测试代码(运行Net 4.0) // Direct Func test1 = x => new Foo(x * 2); int counter1 = 0; Stopwatch s1 = new Stopwatch(); s1.Start(); for (int i = 0; i < 300000000; i++) { counter1 += test1(i).Value; } s1.Stop(); var result1 = s1.Elapsed; // Expression . Compile() Expression<Func> expression = […]

是否有一种方法可以在C#中计算字符串并生成一个整数(假设字符串是一个等式)

好的,我知道在Python中,你说有一个叫做的字符串 strExpression它的值是“1 + 2-(3 * 5)” 有一个python方法(函数,对不起,我得到了混淆的术语)将评估该字符串并返回一个数字整数值(在这种情况下,它应该返回-12。我不记得python语法,因为我做了一个前一段时间(然后我摔断了arm因为无法打字而不得不退出),但希望有人知道我的意思 有没有办法在C#中做到这一点 我只是在学习,并且正在创建一个简单的计算器程序,并且我已经创建了一个基本的计算器程序,允许您添加到以前的数字,但我想为了我自己的利益而扩展它。 非常感谢您的帮助。

结合表达式树

我有以下表达式: public Expression<Func> UserAccessCheckExpression(int userId) where T : class { return x => (IsAdmin || userId == CurrentUserId || userId == 0); } 然后我想将此filter应用于几个集合(IQueryable),如下所示: return tasks .Where(t => t.TaskUsers .Any(x => UserAccessCheckExpression(x.User) && x.SomeBool == true)); 这样做时我收到以下错误: 错误40无法将类型System.Linq.Expressions.Expression<System.Func>隐式转换为bool 我不能使用接口inheritance的解决方法(比如TaskUserinheritance带有int UserId属性的接口(其中T:IHasUserId))因为我想要组合逻辑。