Entity Framework拦截器,默认排序

Entity Framework interceptor, default sorting

我正在尝试 extend/copy 此代码 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 requires an input expression with a collection ResultType. Parameter name: input

谁能帮我解决这个问题 - 并可能帮助我了解发生了什么?

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

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

当然,这只适用于类型本身的 "OrderProp"(您必须为此添加额外的检查)。