c# - 如何扩展谓词以外的调用表达式?

标签 c# linq entity-framework expression-trees linqkit

我刚刚发现了 LINQKit,并且很高兴它似乎为想要分解部分复杂 linq 查询的常见问题提供了解决方案。

但是,所有示例都展示了如何分解 where 子句的谓词

虽然这是一个非常典型的用例,但我也想分解其他类型的表达式,通常用于选择。假设我有以下子表达式:

    Expression<Func<SomeFunkyEntity, String>> GetStatusFromSomeFunkyEntity()
    {
        return i =>
            i.IsExercise ? "Excercise" :
            i.IsExpired ? "Expired" :
            (i.IsLocked ) ? "Locked" :
            i.IsAdmitted ? "Admissible" : "Unusable";
    }

LINQKit 是否提供了一种方法来扩展对此的调用?我尝试过:

var query =
    from i in this.DbContext.MyFunkyEntities.AsExpandable()
    select new SomeFunkyEntityWithStatus()
    {
        FunkyEntity = i,
        Status = GetStatusFromSomeFunkyEntity().Invoke(i)
    };

这符合要求,但在 LINQKit 的扩展器中运行时失败:

Unable to cast object of type 'System.Linq.Expressions.InstanceMethodCallExpressionN' to type 'System.Linq.Expressions.LambdaExpression'.

堆栈跟踪开始于:

at LinqKit.ExpressionExpander.VisitMethodCall(MethodCallExpression m)
at LinqKit.ExpressionVisitor.Visit(Expression exp)
at LinqKit.ExpressionVisitor.VisitMemberAssignment(MemberAssignment assignment)
...

这是不支持的,还是我做错了什么?

最佳答案

您是否尝试在调用调用之前将表达式分配给局部变量?

var statusFromSomeFunkyEntity = GetStatusFromSomeFunkyEntity();

var query =
    from i in this.DbContext.MyFunkyEntities.AsExpandable()
    select new SomeFunkyEntityWithStatus()
    {
        FunkyEntity = i,
        Status = statusFromSomeFunkyEntity.Invoke(i)
    };

查看this answer .

关于c# - 如何扩展谓词以外的调用表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21206844/

相关文章:

c# - 在 2D 中将一个点旋转另一个点

c# - 使用 groupby、sum 和 count 将 SQL 转换为 Linq

c# - 无法测试回文

Web API Controller 方法的 LINQ 查询 JOIN 两个表

c# - 将过滤器字符串转换为 C# 委托(delegate)

c# - 多个相同类型的 Include 语句出现奇怪的 Entity Framework 错误

c# - Entity Framework Code First - 根据子 TPH 类的类型进行选择

c# - 如果我有一个带有 dbcontext 字段的静态类,这是否意味着连接在应用程序的生命周期内保持打开状态?

c# - 将位置参数传递给 Ninject 中的构造函数

c# - 如何在 C# 中向 UserControl 添加事件?