【问题标题】:Getting MemberExpression, expecting ConstantExpression获取 MemberExpression,期待 ConstantExpression
【发布时间】:2014-05-20 20:16:09
【问题描述】:

今天有很多问题!我想不通,所以我想我会把它扔在那里。

我正在编写一个流畅的界面来构建一个 SQL 字符串(是的,我知道 LINQ to Entities...这是一个很长的故事)。

我正在检查 if/else 子句中的表达式类型,如下所示:

if (expression is MemberExpression)
{
    var memberExpression = expression as MemberExpression;
    StringBuilder sb = new StringBuilder();

    ...

    return sb.ToString();
}

if (expression is MethodCallExpression)
{
    var methodCallExpression = expression as MethodCallExpression;
    return GetParameterString(Expression.Lambda(expression).Compile().DynamicInvoke().ToString());
}

if (expression is ConstantExpression)
{
    var constantExpression = expression as ConstantExpression;
    return GetParameterString(constantExpression.Value.ToString());
}

当我通过这段代码运行以下内容时:

.Where(j => j.Driver.Chatiness == searchResource.Chatiness)

...“searchResource.Chatiness”正在激活 MemberExpression 代码,此时应该激活 ConstantExpression(因为 searchResource 是一个包含 Chatiness 属性的对象)。

这是为什么?我对如何解决它有一些想法,但我不想解决它,我希望它起作用!

【问题讨论】:

    标签: c# linq lambda expression-trees


    【解决方案1】:

    访问字段或属性将是 MemberExpression。 ConstantExpression 将是一个常量,例如:

    .Where(j => j.Driver.Chatiness == 5)
    

    【讨论】:

    • 感谢 Dennis_E。我当然知道 ;) 我似乎只记得在这段代码的第一次迭代中,诸如 .Where(j => j.Driver.Chatiness == searchResource.Chatiness) 之类的表达式在哪里遇到了 MemberExpression。不知道为什么。反正现在已经修好了。我发现了如何编译表达式。
    猜你喜欢
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    相关资源
    最近更新 更多