Sql server 实体框架6+;甲骨文;“在哪里?”;条款

Sql server 实体框架6+;甲骨文;“在哪里?”;条款,sql-server,oracle,entity-framework,linq,oracle-manageddataaccess,Sql Server,Oracle,Entity Framework,Linq,Oracle Manageddataaccess,尽管我们尽了最大努力,但在where语句中使用contains时,我们无法让Entity Framework(6.1.3)+Oracle托管数据访问(12.1.2400)生成“IN”子句 对于以下查询: var x = Tests .Where(t => new[] { 1, 2, 3}.Contains(t.ServiceLegId)); var query = x.ToString(); 使用MS SQL(SQL Server),我们可以看到生成以下内容: SELECT [Ext

尽管我们尽了最大努力,但在where语句中使用contains时,我们无法让Entity Framework(6.1.3)+Oracle托管数据访问(12.1.2400)生成“IN”子句

对于以下查询:

var x = Tests
.Where(t => new[] { 1, 2, 3}.Contains(t.ServiceLegId));

var query = x.ToString();
使用MS SQL(SQL Server),我们可以看到生成以下内容:

SELECT 
[Extent1].[Id] AS [Id], 
[Extent1].[TestRunId] AS [TestRunId], 
[Extent1].[DidPass] AS [DidPass], 
[Extent1].[StartTime] AS [StartTime], 
[Extent1].[EndTime] AS [EndTime], 
[Extent1].[ResultData] AS [ResultData], 
[Extent1].[ServiceLegId] AS [ServiceLegId]
FROM [dbo].[Test] AS [Extent1]
WHERE [Extent1].[ServiceLegId] IN (1, 2, 3)
使用Oracle,我们看到:

SELECT 
"Extent1"."Id" AS "Id", 
"Extent1"."TestRunId" AS "TestRunId", 
"Extent1"."DidPass" AS "DidPass", 
"Extent1"."StartTime" AS "StartTime", 
"Extent1"."EndTime" AS "EndTime", 
"Extent1"."ResultData" AS "ResultData", 
"Extent1"."ServiceLegId" AS "ServiceLegId"
FROM "dbo"."Test" AS "Extent1"
WHERE ((1 = "Extent1"."ServiceLegId") OR (2 = "Extent1"."ServiceLegId") OR (3 = "Extent1"."ServiceLegId"))
这是一个微不足道的例子,说明我们实际上必须做什么。在实际的代码库中,这个列表可能会很长,因此一系列“OR”语句会导致非常低效的执行计划


有人遇到过这种情况吗?我觉得我们已经尝试了一切…

尝试使用
测试。加入(new[]{1,2,3},t=>t.ServiceLegId,x=>x,(t,{}=>{})
并查看查询扩展到什么。@repiere感谢您的评论!我们也试过了。。。不幸的是,这会在子查询上生成一个内部联接,该子查询由列表中每个元素的select+union all组成。虽然这会更有效一些,但由于所涉及的查询/操作的巨大规模,在相对较少的条目之后,我们最终会出现堆栈溢出异常。您是否找到解决此问题的方法?“我在Oracle.ManagedDataAccess 12.2.1100中遇到了同样的问题。@不幸的是,他们没有。在本例中,我们放弃了在Oracle中使用EF,而是使用了硬编码查询。Oracle托管数据访问代码的更新可能已经解决了这个问题-我们没有费心验证自己。祝你好运