我有一个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();
但是,由于从未找到名称queryExpression,所以变量internalQueryField始终为null,但存在一个名为“ expression”的属性,但由于“ item”变量为null,因此导致代码失败。
我在做什么错?
答案 0 :(得分:0)
我建议您调试方法string ToODataString<T>(this IQueryable<T> query)
并逐行查看什么是什么。变量:internalQueryFields
始终为null,因为其中不包含任何名称为“ 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
。