问题标签 [iqueryprovider]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
631 浏览

c# - 在 IQueryProvider 的实现中构造 Linq.EnumerableQuery 时出现编译器错误

我有一个 IQueryProvider 的实现,并有以下方法:

items 属性定义为

对于 EnumerableQuery 构造函数,我得到一个神秘的编译器错误:

我究竟做错了什么?我知道它很可能被包含在某个地方的泛型中,但论点对我来说是一样的!

0 投票
0 回答
870 浏览

linq - 具有自定义 IQueryable 和 IQueryProvider 的 ASP.NET OData

我正在尝试使用 Linq to Entities 对 asp.net OData 服务公开的实体应用额外的服务器端过滤。

到目前为止一切都很好,但是我为过滤器构建的 Linq 查询有时会变得很长,从而导致 StackOverflowException。

作为一种解决方法,我想在一个单独的线程中执行查询,为该线程提供更大的堆栈大小限制。为了实现这一点,我实现了 IQueryable 和 IQueryProvider 包装器,这样当调用 IQueryable 的 Execute 方法时,它将在单独的线程中执行。

为了保持简单并专注于我的问题,我将在以下代码示例中省略线程部分,因为这不是这里的问题。

以下是代码的相关部分:

当我运行它时,我在 MyQueryProvider.Execute 方法中得到一个 InvalidOperationException:

这就是我构建传递给 MyQueryable 的原始 IQueryable 的方式:我从实体上下文中获取 DbSet,对其应用 OData 过滤器查询选项,然后调用 Count()。类似于以下内容:

我部分确定问题在于 odata 过滤器查询选项包含嵌套的“任何”过滤器,例如:

这会向 IQueryable 的 Where 表达式添加检查 RelatedEntities 集合是否为空。据推测,此检查是导致上述异常的原因。

我无法理解的是,为什么当我尝试将 Execute 方法的执行从 MyQueryable.Execute 方法委托给它时,原始 IQueryable 会失败,但是当我直接使用原始 IQueryable 时,它​​一切正常。

对此的任何帮助将不胜感激。提前致谢。

0 投票
1 回答
1478 浏览

php - 在第 25 行调用非对象的成员函数 query()

我收到了这个 PHP 致命错误:

致命错误:在非对象上调用成员函数 query()

C:\xampp\htdocs\University\createTables.php 第 25 行

创建表.php

连接.php

0 投票
1 回答
44 浏览

c# - 拦截并覆盖对象中的比较表达式,否则该对象将委托给 Linq to Objects 提供程序

这里的目标是让一些 WCF 数据服务查询场景准确地反映在被测代码中。

按照此处详述的模拟 EF 功能的相同模式,我正在模拟一个 DataServiceQuery 包装类并委托给通过在我的测试数据上调用 .AsQueryable() 返回的 IQueryable。

我想覆盖特定相等表达式的 LINQ to objects 行为(如果重要,在比较两个字节数组时)。我想比较数组中的值而不是引用(例如使用SequenceEqual)。

我可以看到实现这一点的方法是创建一个提供程序,我在其中访问表达式,提取适当的值,组成一个新的表达式,并将其传递给 LINQ to objects 提供程序。这是很多工作。如果不这样做,是否有更简单的方法来完成这项工作,还是我必须求助于解析表达式?

0 投票
0 回答
161 浏览

asp.net-web-api - 以其他 OData 服务为源的 WebApi OData 服务

我有现有的内部 OData 服务。

目标是为外部用户创建新服务。

我尝试使用 odata 客户端创建 IQueryable,然后使用添加了过滤器的 WebApi 将其公开。

就这么简单。然而它不工作。看起来来自 ms odata 客户端的 QueryProvider 不支持由 ms webapi odata 构建的表达式。

此代码正在运行

这个请求不

http://localhost:44301/Model?$filter=contains(Test,'qwe')

例外

The expression (IIF((($it.Test== null) OrElse False), null, Convert($it.Test.Contains(\"qwe\"))) == True) is not supported.

我喜欢这个想法本身,因为我不需要缓存数据而只提供查询。

有什么办法可以使这项工作?

现在我看到的唯一选择是编写自定义 QueryProvider。

0 投票
1 回答
163 浏览

c# - 如何使 LINQ-to-Objects 处理投影?

我已经实现了一个基本的(天真的?)LINQ 提供程序,它可以满足我的目的,但是我想解决一些怪癖,但我不确定如何解决。例如:

我的IQueryProvider实现有一个如下所示的CreateQuery<TResult>实现:

显然,当Expressionis aMethodCallExpressionTResultis a时,这会窒息string,所以我想我会执行该死的事情:

因此,当我运行时,var vendorCodes = context.Vendors.Select(e => e.Key);我最终会陷入private static object Execute<T>(Expression,ViewSet<T>)重载,这会打开最里面的过滤器表达式的方法名称,并在底层 API 中进行实际调用。

现在,在这种情况下,我正在传递Select方法调用表达式,因此过滤器表达式是null并且我的switch块被跳过 - 这很好 - 我被困在这里:

我需要做什么MethodCallExpression才能将其传递给 LINQ-to-Objects 的Select方法?我什至正确地接近这个?

0 投票
1 回答
662 浏览

c# - 从 DbContext 获取 IQueryProvider

我正在尝试编写一个查询提供程序,它DbContext在执行之前实例化一个,执行查询,然后立即处理生成的上下文对象。

为此,我必须实施IQueryProvider.Execute(....). 在这个方法中,我需要IQueryProvider从我的DbContext对象中获取它来执行查询。

问题是我不知道如何从上下文对象访问提供者。据我所知,它存储在((IObjectContextAdapter)context).ObjectContext.QueryProvider但该属性是内部的。

我也尝试从 DbSet 中获取它,但我不知道要指定什么类型。 context.Set(type?).AsQueryable().Provider.Execute<TResult>(expression)或者 context.Set<type?>().AsQueryable().Provider.Execute<TResult>(expression)

所以我的问题是如何IQueryProvider从给定DbContext对象中获取底层。

我试图解决的根本问题

我想在不同的上下文中针对同一个数据库执行多个查询。但是 DbContext 是 IDisposable 你必须将它包装在 using.Blocks 中。

另一种方法是将其包装在自己的方法中:

两者都有很多样板代码,所以我想写一个泛化来打开/处理上下文对象。

我想把它简化成这样:

诀窍是我想repository.Set<T>()返回IQueryable<T>,所以我可以使用所有 Linq 方法。为此,我试图创建自己的IQueryProvider,在其 Execute 方法中使用 Block 包装上下文。

到目前为止,这是我的课:

0 投票
0 回答
142 浏览

c# - 自定义 IQueryProvider 中的 ArgumentNullException

首先了解我为什么尝试创建自定义的一些背景IQueryProvider

我正在为支持IQueryable. 我不想使用 OData 客户端代码生成器(因为我不想在更改服务器时更新客户端或创建新客户端)。我有一个基于默认 Web API 调用的实现WebClient,我想将它重用于 OData。我的服务已经支持 OData 并且运行良好。在客户端,我现在需要一个IQueryable用于将其分配给 DevExpress' ODataInstantFeedbackSource

我的问题是我需要执行 HTTP-Request 来获取IQueryable. 这会导致 OData 查询没有任何限制,从而导致加载大量数据。因此,我的想法是创建某种“可查询的委托”,Func它在其构造函数中接受委托,它定义了对 Web API 的调用,还可以处理表达式树。

我对该解决方案的尝试(示例项目):

我得到以下异常:

排队var y = x.Where(i => i % 2 == 0);

0 投票
1 回答
162 浏览

hibernate - HibernateCursorItemReader 和 EntityGraph

由于结果集的大小,我需要在作业中使用 HibernateCursorItemReader,但我无法使其与 EntityGraph 一起工作以急切地获取一些关系。我正在使用 QueryProvider。

没有任何 EntityGraph 就不会发生连接,并且读取器可以正常工作,但是在批处理期间,Hibernate 会执行大量 SQL 查询以延迟获取数据。这导致处理非常缓慢。

使用查询提示来获取它,任务在此时冻结Loader.class

ResultSet rs = session.getJdbcCoordinator().getResultSetReturn().extract( st );

上面的代码在doOpenHibernateCursorItemReader 的方法中调用,在第一个项目之前。没有错误,没有堆栈跟踪,几分钟内什么也没有,直到我停止 JVM。

我现在正在使用 HibernatePagingItemReader,使用相同的 QueryProvider 并提示急切地获取数据。但是在使用集合获取实体时分页效率不高,JVM 经常会出现内存不足的情况。

抱歉缺少示例代码,但我所拥有的是提到的类的默认配置和实现,没有什么具体可展示的。我认为光标阅读器是解决方案,但它如何与 EntityGraph 一起使用?

编辑 1

EntityGraph 和 HibernateCursorItemReader 一起使用似乎没有问题。耐心等待更多时间,处理开始了。它只是比平常慢,但是休眠的光标阅读器的工作方式与分页阅读器相同,获取所有实体图。