【发布时间】:2019-10-23 02:43:03
【问题描述】:
我有一个 IQueryable 扩展方法需要调用另一个继承自 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 始终为 null,因为从未找到名称 queryExpression,存在名称为“expression”的属性,但这会导致代码失败,因为“item”变量为 null。
我做错了什么?
【问题讨论】:
-
应该
ToAzureSearchFilter实际上是ToODataString吗? -
我们能看到
queryExpression是如何声明的吗?它是字段还是属性?大小写不同吗?它是显式实现的接口的成员吗?它是T的成员而不是IQueryable<T>的成员吗?是公开的吗?是静态的吗?
标签: c# linq extension-methods iqueryable