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"(您必须为此添加额外的检查)。
我正在尝试 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"(您必须为此添加额外的检查)。