【问题标题】:Entity Framework interceptor, default sorting实体框架拦截器,默认排序
【发布时间】:2017-09-01 11:39:52
【问题描述】:

我正在尝试扩展/复制此代码 marisks

包括一个默认的排序拦截器。 但就我的一生而言,我无法完全理解表达式和绑定。

受 SoftDelete 代码的启发

var table = (EntityType)expression.Target.ElementType;
            if (table.Properties.All(p => p.Name != IsDeletedColumnName))
            {
                return base.Visit(expression);
            }

            var binding = expression.Bind();
            return binding.Filter(
                 binding.VariableType
                      .Variable(binding.VariableName)
                      .Property(IsDeletedColumnName)
                      .IsNull()
                );

我正在尝试添加一个类似的东西来对数据进行默认排序。 这是我最接近的(将编译)

var table = (EntityType)expression.Target.ElementType;
            string sortingColumn = "Priority";

            var binding = expression.Bind();

            return binding.Filter(
                 binding.VariableType
                      .Variable(binding.VariableName)
                      .Property(sortingColumn)
                      .OrderBy(m => m)
                );

但它会在运行时抛出异常:

DbExpressionBinding 需要一个带有集合 ResultType 的输入表达式。 参数名称:输入

有人可以帮我解决这个问题 - 并可能帮助我了解发生了什么吗?

【问题讨论】:

  • 你能在某个地方发布一个我可以用来尝试和测试的工作 VS 项目吗?

标签: c# entity-framework linq-to-entities interceptor


【解决方案1】:

我自己做了一些黑客攻击。基本上问题是您尝试创建一个过滤器表达式,但您需要一个排序表达式。像这样的:

var sortingColumn = "OrderProp";
var binding = expression.Bind();
return DbExpressionBuilder.Sort(binding,
                new[] {
                    DbExpressionBuilder.ToSortClause(binding.VariableType.Variable(binding.VariableName).Property(sortingColumn) )
                });

当然,这仅适用于类型本身具有“OrderProp”的情况(您必须为此添加额外的检查)。

【讨论】:

  • 很抱歉没有尽快回复您:-/但感谢您的努力。你的解决方案很棒。这是我不理解的整个 .ToSortClause 语法。非常感谢您的帮助!非常感谢。
  • 没问题,很高兴能帮上忙。 Sort 方法需要一个排序子句列表(一个子句确定排序键和排序方向)。排序键可以是任何东西,但在这种情况下,它只是e=>e.OrderProp 形式的表达式,这与过滤布尔删除标志的情况基本相同,即您需要在相同的结构。
猜你喜欢
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
相关资源
最近更新 更多