【问题标题】:IQueryable Extension - queryExpression filter is always nullIQueryable 扩展 - queryExpression 过滤器始终为空
【发布时间】: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&lt;T&gt; 的成员吗?是公开的吗?是静态的吗?

标签: c# linq extension-methods iqueryable


【解决方案1】:

我建议你调试你的方法string ToODataString&lt;T&gt;(this IQueryable&lt;T&gt; 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

【讨论】:

    猜你喜欢
    • 2022-08-20
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多