Шаг 1: чтение параметров из действия контроллера
public IQueryable<_MODELNAME_> Get(ODataQueryOptions<_MODELNAME_> Options)
{
......
}
Шаг 2: чтение BinaryOperatorNode из параметров
var binaryOperator = Options.Filter.FilterClause.Expression as BinaryOperatorNode;
string filters = getWhereClause(binaryOperator);
Шаг 3: Создайте ниже рекурсивную функцию, чтобы найти все значения фильтра
private static string getWhereClause(BinaryOperatorNode node)
{
var s = "";
if (node.Left is SingleValuePropertyAccessNode && node.Right is ConstantNode)
{
var property = node.Left as SingleValuePropertyAccessNode ?? node.Right as SingleValuePropertyAccessNode;
var constant = node.Left as ConstantNode ?? node.Right as ConstantNode;
if (property != null && property.Property != null && constant != null && constant.Value != null)
{
s += $" {property.Property.Name} {getStringValue(node.OperatorKind)} '{constant.Value}' ";
}
}
else
{
if (node.Left is BinaryOperatorNode)
s += getWhereClause(node.Left as BinaryOperatorNode);
if (node.Right is BinaryOperatorNode)
{
s += $" {getStringValue(node.OperatorKind)} ";
s += getWhereClause(node.Right as BinaryOperatorNode);
}
}
return s;
}