标签: expression-trees

为什么要使用Expression <Func <T >>而不是Func <T>?

我理解lambdas FuncAction代表们.但表达方式让我很难过.在什么情况下你会使用一个Expression<Func<T>>而不是一个普通的老年人Func<T>

c# lambda delegates expression-trees

910
推荐指数
10
解决办法
21万
查看次数

从lambda表达式中检索属性名称

通过lambda表达式传入时,是否有更好的方法来获取属性名称?这是我现在拥有的.

例如.

GetSortingInfo<User>(u => u.UserId);
Run Code Online (Sandbox Code Playgroud)

只有当属性是字符串时,它才能将其作为元素表达式进行处理.因为不是所有属性都是字符串我必须使用对象,但它会返回一个单一表达式.

public static RouteValueDictionary GetInfo<T>(this HtmlHelper html, 
    Expression<Func<T, object>> action) where T : class
{
    var expression = GetMemberInfo(action);
    string name = expression.Member.Name;

    return GetInfo(html, name);
}

private static MemberExpression GetMemberInfo(Expression method)
{
    LambdaExpression lambda = method as LambdaExpression;
    if (lambda == null)
        throw new ArgumentNullException("method");

    MemberExpression memberExpr = null;

    if (lambda.Body.NodeType == ExpressionType.Convert)
    {
        memberExpr = 
            ((UnaryExpression)lambda.Body).Operand as MemberExpression;
    }
    else if (lambda.Body.NodeType == ExpressionType.MemberAccess)
    {
        memberExpr = lambda.Body as MemberExpression;
    }

    if (memberExpr …
Run Code Online (Sandbox Code Playgroud)

c# linq lambda expression-trees

489
推荐指数
14
解决办法
21万
查看次数

Roslyn语法节点是否重用?

我一直在研究Roslyn CTP,虽然它解决了与Expression树API类似的问题,但它们都是不可变的,但Roslyn以一种完全不同的方式这样做:

  • Expression节点没有对父节点的引用,使用a进行修改ExpressionVisitor,这就是为什么可以重用大部件的原因.

  • SyntaxNode另一方面,Roslyn 有一个对其父级的引用,因此所有节点都有效地成为一个无法重用的块.类似的方法Update,ReplaceNode等等,提供了进行修改.

这到底在哪里?DocumentProjectISolution?API促进树的逐步更改(而不是按钮向上),但每个步骤是否完整复制?

为什么他们这样做了?我有什么有趣的伎俩吗?

c# expression-trees roslyn

120
推荐指数
1
解决办法
5982
查看次数

Expression.Quote()做了什么,Expression.Constant()不能做什么?

注意:我知道之前的问题" LINQ的Expression.Quote方法的目的是什么?",但如果你继续阅读,你会发现它没有回答我的问题.

我明白所说的目的Expression.Quote()是什么.但是,Expression.Constant()可以用于相同的目的(除了Expression.Constant()已经使用的所有目的).因此,我不明白为什么Expression.Quote()需要.

为了证明这一点,我写了一个快速的例子,其中一个人习惯使用Quote(见标有感叹号的行),但我使用了Constant它,它同样有效:

string[] array = { "one", "two", "three" };

// This example constructs an expression tree equivalent to the lambda:
// str => str.AsQueryable().Any(ch => ch == 'e')

Expression<Func<char, bool>> innerLambda = ch => ch == 'e';

var str = Expression.Parameter(typeof(string), "str");
var expr =
    Expression.Lambda<Func<string, bool>>(
        Expression.Call(typeof(Queryable), "Any", new Type[] { typeof(char) },
            Expression.Call(typeof(Queryable), "AsQueryable",
                            new Type[] { typeof(char) }, str),
            // …
Run Code Online (Sandbox Code Playgroud)

c# expression-trees

93
推荐指数
2
解决办法
9848
查看次数

编译C#Lambda表达式性能

考虑以下对集合的简单操作:

static List<int> x = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
var result = x.Where(i => i % 2 == 0).Where(i => i > 5);
Run Code Online (Sandbox Code Playgroud)

现在让我们使用表达式.以下代码大致相当:

static void UsingLambda() {
    Func<IEnumerable<int>, IEnumerable<int>> lambda = l => l.Where(i => i % 2 == 0).Where(i => i > 5);
    var t0 = DateTime.Now.Ticks;
    for (int j = 1; j < MAX; j++) 
        var sss = lambda(x).ToList();

    var tn = DateTime.Now.Ticks;
    Console.WriteLine("Using lambda: {0}", tn …
Run Code Online (Sandbox Code Playgroud)

c# performance lambda expression-trees

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

在C#中序列化和反序列化表达式树

有没有办法在C#中反序列化表达式,我想将表达式存储在数据库中并在运行时加载它们.

c# serialization expression-trees

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

LINQ to Entities仅支持使用IEntity接口转换EDM原语或枚举类型

我有以下通用扩展方法:

public static T GetById<T>(this IQueryable<T> collection, Guid id) 
    where T : IEntity
{
    Expression<Func<T, bool>> predicate = e => e.Id == id;

    T entity;

    // Allow reporting more descriptive error messages.
    try
    {
        entity = collection.SingleOrDefault(predicate);
    }
    catch (Exception ex)
    {
        throw new InvalidOperationException(string.Format(
            "There was an error retrieving an {0} with id {1}. {2}",
            typeof(T).Name, id, ex.Message), ex);
    }

    if (entity == null)
    {
        throw new KeyNotFoundException(string.Format(
            "{0} with id {1} was not found.",
            typeof(T).Name, id));
    }

    return …
Run Code Online (Sandbox Code Playgroud)

.net c# entity-framework expression-trees dbcontext

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

如何在通用扩展方法中使用字符串列名在IQueryable上应用OrderBy?

public static IQueryable<TResult> ApplySortFilter<T, TResult>(this IQueryable<T> query, string columnName)
  where T : EntityObject
{
  var param = Expression.Parameter(typeof(T), "o");
  var body = Expression.PropertyOrField(param,columnName);

  var sortExpression = Expression.Lambda(body, param);
  return query.OrderBy(sortExpression);
}
Run Code Online (Sandbox Code Playgroud)

因为OrderBy的类型不是从sortExpression中推断出来的,所以我需要在运行时指定类似的东西:

var sortExpression = Expression.Lambda<T, TSortColumn>(body, param);
Run Code Online (Sandbox Code Playgroud)

要么

return query.OrderBy<T, TSortColumn>(sortExpression);
Run Code Online (Sandbox Code Playgroud)

我不认为这是可能的,因为TSortColumn只能在运行时确定.

有没有解决的办法?

.net c# linq entity-framework expression-trees

83
推荐指数
5
解决办法
8万
查看次数

表达树为假人?

在这种情况下我是假的.

我试图在谷歌上读到这些是什么,但我只是不明白.有人可以给我一个简单的解释,说明它们是什么以及为什么它们有用?

编辑:我在谈论.Net中的LINQ功能.

.net c# linq expression-trees

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

什么是表达式树,你如何使用它们,为什么要使用它们?

我刚刚遇到过多次表达树的概念.我只想了解表达式树及其用途的含义.

如果有人能指导我简单的解释和使用样本,我会很高兴.

.net c# linq expression-trees

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