Расширение IQueryable - фильтр queryExpression всегда имеет значение null - PullRequest
0 голосов
/ 07 июня 2019

У меня есть метод IQueryable Extension, который должен вызывать другой класс, который наследуется от ExpressionVisitor.

Я пробираюсь по Интернету для некоторых примеров кода и обнаружил следующее:

public static string ToODataString<T>(this IQueryable<T> query)
{
    var internalQueryFields = query.GetType().GetFields(
               BindingFlags.Instance |
               BindingFlags.NonPublic);

    var internalQueryField = internalQueryFields.Where(f => f.Name.Equals("queryExpression")).FirstOrDefault();
    var internalQuery = internalQueryField.GetValue(query);

    var type = internalQuery.GetType();

    var objectQueryFields = internalQuery.GetType().GetFields(
        System.Reflection.BindingFlags.NonPublic |
        System.Reflection.BindingFlags.Instance);

    var objectQueryField = objectQueryFields.Where(f => f.Name.Equals("_arguments")).FirstOrDefault();

    var item = objectQueryField.GetValue(internalQuery) as IReadOnlyCollection<Expression>;

    var quote = item.Where(t => t.NodeType == ExpressionType.Quote).FirstOrDefault() as UnaryExpression;

    var translator = new ODataTranslator();
    return translator.Translate(quote.Operand as LambdaExpression);
}

Я использую расширение как это .....

var orders = new List<SalesOrder>();
var filterString = orders.Where(x => x.CustomerName == "Simple Filter").AsQueryable().ToODataString();

Однако переменная internalQueryField всегда равна нулю, так как имя queryExpression никогда не найдено, есть свойство с именем "expression", но тогдаприводит к сбою кода, потому что переменная "item" имеет значение null.

Что я делаю неправильно?

1 Ответ

0 голосов
/ 08 июня 2019

Я рекомендую вам отладить ваш метод string ToODataString<T>(this IQueryable<T> query) и построчно видеть, что к чему.Переменная: internalQueryFields всегда равна нулю, поскольку не содержит никакого объекта с именем: ' queryExpression '.

Поскольку у меня недостаточно подробностей по вашему вопросу, я предполагаючто ваш класс выглядит примерно так:

public class SalesOrder
{
    public string CustomerName { get; set; }
}

И вы имеете в виду это:

var orders = new List<SalesOrder>() { new SalesOrder() {  CustomerName = "Simple Filter" } };

var filterString = orders.Where(x => x.CustomerName == "Simple Filter").AsQueryable().ToODataString();

Отладка Я обнаружил, что queryExpression нет, но: _expression и _enumerable.

enter image description here

enter image description here

...