У меня есть метод 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.
Что я делаю неправильно?