标签: expression-trees

在C#中遇到BinaryExpression

我想实施

Expression<Func<int, int, int>> Max = (p1,p2) => p1 > p2 ? p1:p2;
Run Code Online (Sandbox Code Playgroud)

作为表达树并尝试过

ParameterExpression LeftEx = Expression.Parameter(typeof(int), "p1");
ParameterExpression RightEx = Expression.Parameter(typeof(int), "p2");
BinaryExpression GroesserAls =  Expression.GreaterThan(LeftEx, RightEx);
ConditionalExpression Cond = BinaryExpression.Condition(GroesserAls, LeftEx, RightEx);
Expression main = Cond.Test;
Expression<Func<int, int, bool>> Lam = Expression.Lambda<Func<int, int, bool>>(main,
  new ParameterExpression[] { LeftEx, RightEx });
Console.WriteLine(Lam.Compile().Invoke(333, 1200));
Run Code Online (Sandbox Code Playgroud)

使用Cond我要么得到真/假,而不是条件应该返回的LeftEx或RightEx.

我在文档中找不到任何内容.

彼得

c# expression-trees

3
推荐指数
1
解决办法
2784
查看次数

WhereNot linq表达式

我正在尝试创建一个扩展名"WhereNot"

所以我可以用:

Dim x = "Hello world "
Dim y = x.Split.WhereNot(AddressOf String.IsNullOrEmpty)
Run Code Online (Sandbox Code Playgroud)

请注意,我的目标是学习linq表达式; 没解决我的问题.

我创造了这个功能:

 <Extension()> _
 Public Function WhereNot(Of TElement)(ByVal source As IQueryable(Of TElement), ByVal selector As Expression(Of Func(Of TElement, Boolean))) As IQueryable(Of TElement)
  Return source.Where(GetWhereNotExpression(selector))
 End Function
Run Code Online (Sandbox Code Playgroud)

我不知道如何切换布尔标志,函数Negate会这样做吗?

vb.net和C#的答案都很受欢迎

.net linq expression expression-trees linq-expressions

3
推荐指数
1
解决办法
1348
查看次数

获取树中定义的积分的总和和乘积

我在Haskell中了解如何处理以下内容时遇到一些问题:

假设我有类似这样的声明:

  • a*(b + c)
  • a +(b*c)
  • a +(b*(c + d))
  • a*(b +(c*d))
  • 等等

我想在树中表达这些语句并评估每个语句的结果,对于初学者我定义了以下数据结构:

data statement = Number Int 
               | Product statement statement 
               | Sum statement statement
               deriving (Eq, Show)
Run Code Online (Sandbox Code Playgroud)

对于要使用的示例树,我使用了以下函数:

a :: statement
a = Product (Number 2) (Sum (Number 5) (Number 1))
Run Code Online (Sandbox Code Playgroud)

现在我想构建一个函数treeResult,它给出了我定义的语句的结果,但我不知道如何处理这个问题.为上述语句返回的整数应为12.

我的第一个猜测是编写一个函数,它将"statement"作为参数并返回一个int,仅对于简单语句的starters.

treeResult :: statement -> Int
treeResult (Number a) = a
treeResult (Product (Number a) (Number b)) = a*b
treeResult (Sum (Number a) (Number b)) = a+b
Run Code Online (Sandbox Code Playgroud)

现在我知道我需要一些可以递归的东西,但我不知道如何在haskell中编写它,有人可以帮助我吗?

recursion haskell functional-programming expression-trees

3
推荐指数
1
解决办法
408
查看次数

将表达式树解析为Sqlstring - 不重新发明轮子

我需要解析一个表达式来获取一个sql where子句.

.NET FX中是否有任何类或任何已具备此功能的第三方库?

我的意思是Linq2SQL,EntityFramework,所有这些都必须这样做,所以有人知道,如果有什么可以重复使用而不是重新发明轮子?

MyType.Where(Func<TEntity,bool>((entity)=>entity.Id == 5))) 
Run Code Online (Sandbox Code Playgroud)

现在我需要获取表示where子句的相应字符串:

 where abc.Id = "5" 
Run Code Online (Sandbox Code Playgroud)

这只是一个简单的例子.它也应该与逻辑连词一起使用.

我知道我可以创建表达式树并自己解析它,但我认为可能存在已经存在的东西,我错过了

sql linq string parsing expression-trees

3
推荐指数
1
解决办法
825
查看次数

在.NET上实现DSL

我正在.NET(4.0)上实现一个小型DSL,我目前正在使用Expression Trees将DSL转变为可执行代码块.

DSL是预定义的,因为我们正在实现对旧文件格式的支持.

Expression Trees是否适合这项工作?

dsl .net-4.0 expression-trees c#-4.0

3
推荐指数
1
解决办法
930
查看次数

使用Action <T>的表达式树可能吗?

我正在努力解决一些问题.我最初创建了一个通用层,它位于我的业务对象和工作正常的数据访问层之间.然后,我最近阅读了一些名为Expression Trees的内容,它显然更有效,并且已经证明是这样,因为我将Activator.CreateInstance()与表达式交换,并以指数方式改进了我的通用层.

我还在阅读有关整个区域(表达式)的一些内容,但我遇到了一些我想尝试制作通用的代码.目前,你必须传递一个具体的类型,如字符串,int,十进制等.我有点通用.我试了几件但失败了.我想要通用的位是Action,我不想传入一个字符串,我希望能够传递一般属性的类型,即typeof(T).GetProperty("Forename").PropertyType.这可能吗?正在考虑做一个有点foo bar的switch语句.

在此先感谢Onam.

public class TTT<T> where T : new()
{
    public void Do(object t)
    {
        MethodInfo info = typeof(T).GetProperty("Forename").GetSetMethod();

        ParameterExpression param = Expression.Parameter(typeof(string), "val");

        MethodCallExpression call = Expression.Call(Expression.Constant(t), info,
            new ParameterExpression[] { param });

        Action<string> action = Expression.Lambda<Action<string>>(call, param).Compile();

        action("hi");
    }
}
Run Code Online (Sandbox Code Playgroud)

c# generics reflection expression-trees

3
推荐指数
1
解决办法
3080
查看次数

合并属性选择器表达式树和值以创建EF过滤的谓词 - 从lambda选择器和值创建过滤器

给定一个具有任意属性的简单类(讨论可以说是Id,Name和Description)

并且给定该类的实例,我想通过指定要匹配的属性来在数据库中找到匹配的条目

我试图在这方面做一些类似于EF的AddOrUpdate方法的事情,但我需要实体返回给我进行进一步处理.

var match = new SomeClass{Name="Whatever"};
var found = Context.SomeClass.Find(x=>x.Name, match);

public static T Find<T>(this DbSet<T> set, Expression<Func<T, object>> matchOn, T matchAgainst) where T : class {
  var func = matchOn.Compile();
  var valueToFind = func(matchAgainst);


 var combinedExpression = //matchon + "=" + valueToFind;
 var found = set.FirstOrDefault(combinedExpression);
 return found;
 }
Run Code Online (Sandbox Code Playgroud)

这给了我传入的对象中属性的值,但我现在需要将该值与传入的表达式组合并将其传递给数据库集.

IE浏览器,我试图有效运行的代码是 set.FirstOrDefault(x=>x.Name==valueToFind)如何把matchon表达式(包含x=>x.Name),并结合起来,与将==valueToFind得到x=>x.Name==valueToFind来自他们?

如何构建组合表达式?(我意识到上面的"字符串"代码是完全错误的,但我试图了解我需要该函数做什么,但我不知道那个语法会是什么样子.)

对于手动编码的示例,只需传入带有值集的硬编码lambda就足够了,但是我的用例包括遍历一组对象并找到每个对象的匹配,因此在运行时之前不会知道该值,并且该方法必须对任意类型和各种属性起作用,因此我也不能对属性名称进行硬编码.

c# linq lambda entity-framework expression-trees

3
推荐指数
1
解决办法
769
查看次数

转换Expression和Delegate之间的错误

我们可以写下面的代码:

 Func<string, string> func = x => x + x;
Run Code Online (Sandbox Code Playgroud)

我们也可以写:

 Expression<Func<string, string>> exp = x => x + x;
Run Code Online (Sandbox Code Playgroud)

但是当我写道:

Expression<Func<string, string>> exp = func;
Run Code Online (Sandbox Code Playgroud)

编译器抛出一个错误:

无法将类型'System.Func'隐式转换为'System.Linq.Expressions.Expression>'

所以我改变代码如下:

  Expression<Func<string, string>> exp = (Expression<Func<string, string>>)func;
Run Code Online (Sandbox Code Playgroud)

和以前一样的错误.

那么什么是真正的类型x => x + x;,Expression和Delegate/Lambda Expression之间的关系是什么?

c# lambda delegates expression expression-trees

3
推荐指数
1
解决办法
131
查看次数

如何使用System.Linq.Expressions API模拟"typeof(T)"?

我正在尝试DataTable使用System.Linq.ExpressionsAPI 创建一个从对象列表创建的方法,但我无法弄清楚如何生成我在反编译表达式时得到的以下IL typeof (int).

IL_0000:  nop         
IL_0001:  ldtoken     System.Int32
IL_0006:  call        System.Type.GetTypeFromHandle
IL_000B:  call        LINQPad.Extensions.Dump<Object>
IL_0010:  pop         
IL_0011:  ret
Run Code Online (Sandbox Code Playgroud)

目前我试图通过调用Type.GetType("System.Int")来解决问题,但我想生成代码,typeof (int)如果可能的话.

c# cil metaprogramming expression-trees

3
推荐指数
1
解决办法
153
查看次数

表达式在同一属性上将一个对象映射到另一个对象

我正在尝试使用Expression此代码创建一个简单的映射器:

public static class MyUtility {

    public static Action<TSource, TTarget> BuildMapAction<TSource, TTarget>(IEnumerable<PropertyMap> properties) {

        var sourceInstance = Expression.Parameter(typeof(TSource), "source");
        var targetInstance = Expression.Parameter(typeof(TTarget), "target");

        var statements = BuildPropertyGettersSetters(sourceInstance, targetInstance, properties);

        Expression blockExp = Expression.Block(new[] { sourceInstance, targetInstance }, statements);

        if (blockExp.CanReduce)
            blockExp = blockExp.ReduceAndCheck();
        blockExp = blockExp.ReduceExtensions();

        var lambda = Expression.Lambda<Action<TSource, TTarget>>(blockExp, sourceInstance, targetInstance);

        return lambda.Compile();
    }

    private static IEnumerable<Expression> BuildPropertyGettersSetters(
        ParameterExpression sourceInstance,
        ParameterExpression targetInstance,
        IEnumerable<PropertyMap> properties) {

        var statements = new List<Expression>();

        foreach (var property in properties) …
Run Code Online (Sandbox Code Playgroud)

c# linq lambda expression-trees dynamicmethod

3
推荐指数
1
解决办法
726
查看次数