【问题标题】:Call linqkit expression in a dynamic linq query在动态 linq 查询中调用 linqkit 表达式
【发布时间】:2013-07-30 12:03:58
【问题描述】:

如何调用这个 LinqKit 表达式

    public static Expression<Func<Transaction, string>> ExpressionOfStatusName
    {
        get
        {
            Expression<Func<Transaction, string>> status =
                (transaction) =>  transaction.TransactionStatus.Name;
            return status;
        }
    }

在动态 linq 查询中(使用 Microsoft 的 System.Linq.Dynamic 作为字符串的 Linq)

这个表达式在像这样的标准 Linq 查询中效果很好

Expression<Func<Transaction, string>> expressionOfStatusName = Transaction.ExpressionOfStatusName;

var ex = from transaction in context.Transaction.AsExpandable()
         select expressionOfStatusName.Invoke(transaction)

但是当我尝试从动态 linq 查询中调用它时,我收到错误“'Expression`1' 类型中不存在适用的方法 'Invoke' 我尝试在文件 System.Linq.Dynamic 中添加 linqkit 导入,但仍然无法正常工作。

我希望能够做这样的事情

var ex = context.Transaction.AsExpandable()
.Select (transaction=>transaction)
.Select("new { test = expressionOfStatusName.Invoke(transaction)");

感谢您的帮助

【问题讨论】:

    标签: c# linq entity-framework dynamic-linq linqkit


    【解决方案1】:

    Linq 需要 func 的表达式。您可以使用 MS Linq.Dynamic 扩展,它接受字符串并将它们转换为表达式树。或者您可以使用任何您喜欢的工具来构建表达式树。然而,MS 动态 linq 扩展解析一组有限的字符串输入。 Some sample docu/blog 您要求它解析 expressionOfStatusName.Invoke(transaction)" 我不认为它可以做到这一点。您可以调试源来检查。 但我记得在那里看到过简单的成员分析。 The source is here

    此外,一旦您通过了解析挑战,我认为您正在推动可接受的匿名类型输入的限制。 anonymous types and Linq

    【讨论】:

    • 我已经在使用 MS Linq.Dynamic 我正在尝试修改源代码,我正在尝试更改函数 FindMethod 以调用 LinqKit 方法:int FindMethod(Type type, string methodName, bool staticAccess, Expression[] args, out MethodBase method) { if (methodName == "Invoke") { method = typeof(LinqKit.Extensions) .GetMethods() .Where(o =&gt; o.Name == "Invoke").First(); return 1; } [...] 但它返回错误方法类型'无法访问扩展程序。
    • 我注意到.....你试图喂它“new { test = expressionOfStatusName.Invoke(transaction)”。请再次阅读答案。我在哪里不清楚吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-26
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多