【问题标题】:EF Core Include method not workingEF Core Include 方法不起作用
【发布时间】:2017-11-03 23:18:42
【问题描述】:

我最近更新到了 asp.net core 2.0。由于使用 Include 方法升级我的所有 Linq 查询都失败了,因此它没有正确地转换为 SQL。

例如:

var entities = helpTopicRepository.Entities.Include(x => x.HelpArticles).FirstOrDefault(t => topicIds.Any(a => a == t.Id));

翻译成:

SELECT x.HelpArticles.ART_ID, 
x.HelpArticles.AVAILABLE, 
x.HelpArticles.CONTENT, 
x.HelpArticles.DISPLAYORDER, 
x.HelpArticles.HELPFULNO, 
x.HelpArticles.HELPFULYES, 
x.HelpArticles.KEYWORDS, 
x.HelpArticles.TITLE, 
x.HelpArticles.TOPICID
FROM HELPARTICLE x.HelpArticles 

这会导致以下错误:

Devart.Data.Oracle.OracleException (0x80004005): ORA-00933: SQL

命令在 Devart.Data.Oracle.ay.b() 处未正确结束 Devart.Data.Oracle.am.f() 在 Devart.Data.Oracle.am.e() 在 Devart.Data.Oracle.c5.a(am A_0, Int32 A_1) 在 Devart.Data.Oracle.c5.a(Int32 A_0, bg A_1) 在 Devart.Data.Oracle.OracleCommand.InternalExecute(CommandBehavior 行为,IDisposable 一次性,Int32 startRecord,Int32 maxRecords, 布尔非查询)在 Devart.Common.DbCommandBase.ExecuteDbDataReader(CommandBehavior 行为,布尔非查询)在 Devart.Data.Oracle.Entity.ai.a(CommandBehavior A_0) 在 Devart.Common.Entity.cj.d(CommandBehavior A_0) 在 Devart.Data.Oracle.Entity.ai.b(CommandBehavior A_0) 在 System.Data.Common.DbCommand.ExecuteReader() 在 Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.Execute(IRelationalConnection 连接,DbCommandMethod 执行方法,IReadOnlyDictionary2 parameterValues) at Microsoft.EntityFrameworkCore.Storage.Internal.RelationalCommand.ExecuteReader(IRelationalConnection connection, IReadOnlyDictionary2 参数值)在 Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable1.Enumerator.BufferlessMoveNext(Boolean buffer) at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable1.Enumerator.MoveNext() 在 Microsoft.EntityFrameworkCore.Query.Internal.QueryBuffer.IncludeCollection(Int32 includeId, INavigation 导航, INavigation inverseNavigation, IEntityType 目标实体类型,IClrCollectionAccessor clrCollectionAccessor,IClrPropertySetter 逆ClrPropertySetter, 布尔跟踪,对象实体,Func1 relatedEntitiesFactory) at lambda_method(Closure , QueryContext , Client , Object[] ) at Microsoft.EntityFrameworkCore.Query.Internal.IncludeCompiler._Include[TEntity](QueryContext queryContext, TEntity entity, Object[] included, Action3 fixup)在 lambda_method(闭包,客户端)在 System.Linq.Enumerable.SelectEnumerableIterator2.MoveNext() at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable1 来源) 在 lambda_method(Closure, QueryContext) 在 Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.c__DisplayClass17_0`1.b__0(QueryContext qc) ORA-00933: SQL 命令未正确结束

我正在使用 Devart dotconnect 连接到 Oracle 数据库。

【问题讨论】:

  • 同样的情况发生在这里,最近更新到 .net core 2.0。如果你刚刚得到它,请告诉我你的修复。
  • 这是一个 devart 问题,他们正在努力修复。

标签: entity-framework linq asp.net-core devart


【解决方案1】:

是因为你的陈述:

var entities = helpTopicRepository.Entities.Include(x => x.HelpArticles).FirstOrDefault(t => topicIds.Any(a => a == t.Id));

假设topicIds 是一个列表,这里有一个修复:

var entities = helpTopicRepository.Entities
    .Include(x => x.HelpArticles)
    .Where(t => topicIds.Contains(t.Id))
    .FirstOrDefault();

【讨论】:

  • 此代码在功能上等同于 OP 已有的代码。进行这些更改不会解决问题。
【解决方案2】:

修复了在 EF Core 2 中使用多个 .Include() 的错误。期待 dotConnect for Oracle 的下一个公共版本。

【讨论】:

猜你喜欢
  • 2020-02-22
  • 2017-06-27
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多