IQueryable扩展-queryExpression过滤器始终为null

时间:2019-06-07 15:05:23

标签: c# linq extension-methods iqueryable

我有一个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,因此导致代码失败。

我在做什么错?

1 个答案:

答案 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

enter image description here

enter image description here