标签: expression-trees

表达树的实际用法

表达树是一个很好的功能,但它的实际用途是什么?它们可以用于某种代码生成或元编程或其他类似的吗?

c# expression-trees

66
推荐指数
7
解决办法
2万
查看次数

访问成员表达式的值

如果我有产品.

var p = new Product { Price = 30 };
Run Code Online (Sandbox Code Playgroud)

我有以下linq查询.

var q = repo.Products().Where(x=>x.Price == p.Price).ToList()
Run Code Online (Sandbox Code Playgroud)

在IQueryable提供程序中,我得到一个包含常量表达式的p.Price的MemberExpression,但是我似乎无法从它获得值"30".

更新 我试过这个,但它似乎不起作用.

var memberExpression = (MemberExpression)GetRootConstantExpression(m);
var fi = (PropertyInfo)memberExpression.Member;
var val = fi.GetValue(((ConstantExpression)memberExpression.Expression).Value, null);
Run Code Online (Sandbox Code Playgroud)

干杯.

c# linq lambda expression-trees

63
推荐指数
5
解决办法
4万
查看次数

如何创建表达式树来表示C#中的'String.Contains("term")'?

我刚刚开始使用表达式树,所以我希望这是有道理的.我正在尝试创建一个表达式树来表示:

t => t.SomeProperty.Contains("stringValue");
Run Code Online (Sandbox Code Playgroud)

到目前为止我有:

    private static Expression.Lambda<Func<string, bool>> GetContainsExpression<T>(string propertyName, string propertyValue)
    {
        var parameterExp = Expression.Parameter(typeof(T), "type");
        var propertyExp = Expression.Property(parameter, propertyName);
        var containsMethodExp = Expression.*SomeMemberReferenceFunction*("Contains", propertyExp) //this is where I got lost, obviously :)
        ...
        return Expression.Lambda<Func<string, bool>>(containsMethodExp, parameterExp); //then something like this
    }
Run Code Online (Sandbox Code Playgroud)

我只是不知道如何引用String.Contains()方法.

帮助赞赏.

.net c# lambda expression-trees

57
推荐指数
3
解决办法
3万
查看次数

Expression类的目的是什么?

我想知道在内部包装代表之间究竟有什么区别Expression<>

我看到Expression<Foo>LinQ使用了很多,但到目前为止,我还没有找到任何解释它之间差异的文章,只是使用了一个委托.

例如

Func<int, bool> Is42 = (value) => value == 42;
Run Code Online (Sandbox Code Playgroud)

Expression<Func<int, bool>> Is42 = (value) => value == 42;
Run Code Online (Sandbox Code Playgroud)

c# lambda expression-trees

55
推荐指数
4
解决办法
1万
查看次数

内部.NET Framework数据提供程序错误1025

IQueryable<Organization> query = context.Organizations;

Func<Reservation, bool> predicate = r => !r.IsDeleted;

query.Select(o => new { 
    Reservations = o.Reservations.Where(predicate)
}).ToList();
Run Code Online (Sandbox Code Playgroud)

此查询引发"内部.NET Framework数据提供程序错误1025"异常,但下面的查询不会.

query.Select(o => new { 
    Reservations = o.Reservations.Where( r => !r.IsDeleted)
}).ToList();
Run Code Online (Sandbox Code Playgroud)

我需要使用第一个,因为我需要检查一些if语句来构造正确的谓词.我知道在这种情况下我不能使用if语句,这就是我将委托作为参数传递的原因.

如何使第一个查询起作用?

.net c# entity-framework expression-trees entity-framework-4

55
推荐指数
4
解决办法
2万
查看次数

深入学习C#表达式树的最佳资源是什么?

当我第一次输入这个问题时,我这样做是为了找到重复的问题,确信有人必须已经问过这个问题.我的计划是遵循这些欺骗链接而不是发布此问题.但据我所知,这个问题以前没有被问过......它没有出现在"相关问题"列表中.

为了深入了解C#中的表达式树,你找到了哪些最好的资源(文章,书籍,博客文章等)? 我一直对他们的能力感到惊讶,现在我正处在我说的地方,"好吧,足够的惊喜.我现在想停下来获得这些东西的博士学位." 我正在寻找系统,有条理地涵盖功能的材料,然后详细介绍了如何使用它们.

注意:我不是在谈论lambda表达式.我在谈论Expression <T>以及随之而来的所有事情.

谢谢.

c# lambda expression-trees c#-3.0

53
推荐指数
3
解决办法
8512
查看次数

将谓词的表达式树变换为目标另一种类型

介绍

在我目前正在处理的应用程序中,每个业务对象有两种:"ActiveRecord"类和"DataContract"类.例如,会有:

namespace ActiveRecord {
    class Widget {
        public int Id { get; set; }
    }
}

namespace DataContract {
    class Widget {
        public int Id { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)

数据库访问层负责在系列之间进行转换:您可以告诉它更新a DataContract.Widget,它将神奇地创建ActiveRecord.Widget具有相同属性值的数据并保存它.

尝试重构此数据库访问层时,问题浮出水面.

问题

我想在数据库访问层中添加如下方法:

// Widget is DataContract.Widget

interface IDbAccessLayer {
    IEnumerable<Widget> GetMany(Expression<Func<Widget, bool>> predicate);
}
Run Code Online (Sandbox Code Playgroud)

以上是一个简单的通用"get"方法,带有自定义谓词.唯一感兴趣的是我传递的是表达式树而不是lambda,因为IDbAccessLayer我在里面查询一个IQueryable<ActiveRecord.Widget>; 为了有效地做到这一点(想想LINQ to SQL)我需要传入一个表达式树,所以这个方法只是要求.

障碍:参数需要从一个神奇地转换Expression<Func<DataContract.Widget, bool>>为一个Expression<Func<ActiveRecord.Widget, bool>>.

试图解决方案

我想在里面做的GetMany是:

IEnumerable<DataContract.Widget> GetMany(
    Expression<Func<DataContract.Widget, bool>> predicate)
{
    var lambda = …
Run Code Online (Sandbox Code Playgroud)

c# linq lambda expression-trees

50
推荐指数
4
解决办法
8540
查看次数

C#4表达式树中的"动态"

我正在试图弄清楚如何将所有部分组合在一起,并希望从一个简单的案例开始的具体源代码示例.

考虑以下C#代码:

Func<int, int, int> f = (x, y) => x + y;
Run Code Online (Sandbox Code Playgroud)

我可以使用表达式树在运行时生成等效函数,如下所示:

var x = Expression.Parameter(typeof(int), "x");
var y = Expression.Parameter(typeof(int), "y");
Func<int, int, int> f =
    Expression.Lambda<Func<int, int, int>>(
        Expression.Add(x, y),
        new[] { x, y }
    ).Compile();
Run Code Online (Sandbox Code Playgroud)

现在给出以下lambda:

Func<dynamic, dynamic, dynamic> f = (x, y) => x + y;
Run Code Online (Sandbox Code Playgroud)

如何使用表达式树(并且,大概Expression.Dynamic)生成等效的?

c# dynamic expression-trees c#-4.0

49
推荐指数
1
解决办法
1万
查看次数

C#和VB.Net之间的表达式树差异

我有一个处理表达式树的库.该库需要与C#和VB.Net一起使用

注意到语言之间关于如何构造表达式树的一些差异

  • 字符串比较
    () => "a" == "b"Expression.Equals("a", "b")
    Function() "a" = "b"Expression.Equals(Expression.Call(CompareString, "a", "b"), 0)
    (我明白为什么VB.Net使用此处CompareString)

  • 字符串连接
    () => "a" + "b"变得Expression.Add("a", "b", String.Concat)
    Function() "a" & "b"变得Expression.Call(String.Concat, "a", "b")

  • 优化?
    () => !(1 == 2)变得Expression.Not(Expression.Equals(1, 2))
    Function() Not (1 = 2)变得Expression.NotEqual(1, 2)

我的图书馆处理所有这些差异,但是我需要注意更多的差异吗?

编辑 我的代码所做的一些解释.

我使用的系统有一个过滤器,您可以像这样指定文档:

var filter = document.Filter;
filter.LeftParanthesis();
filter.Column(columnNumber);
filter.Equals();
filter.Value("abc");
filter.RightParanthesis();
filter.And();
filter.LeftParanthesis();
...
document.Refresh();
Run Code Online (Sandbox Code Playgroud)

为了更容易使用过滤器,我的代码允许您将过滤器指定为Expression<Func<bool>>lambda.

Expression<Func<bool>> filter = …
Run Code Online (Sandbox Code Playgroud)

c# vb.net expression-trees

49
推荐指数
1
解决办法
1879
查看次数

如何创建LINQ表达式树以选择匿名类型

我想使用表达式树动态生成以下select语句:

var v = from c in Countries
        where c.City == "London"
        select new {c.Name, c.Population};
Run Code Online (Sandbox Code Playgroud)

我已经研究出如何生成

var v = from c in Countries
        where c.City == "London"
        select new {c.Name};
Run Code Online (Sandbox Code Playgroud)

但我似乎无法找到一个构造函数/重载,让我在select lambda中指定多个属性.

c# linq linq-to-entities entity-framework expression-trees

45
推荐指数
3
解决办法
3万
查看次数