IQueryable返回不一致的结果

时间:2019-01-22 09:52:39

标签: .net linq-to-sql entity-framework-6 linq-to-entities devart

我有一个相对简单的查询,它返回不一致的结果。

具有ID的集合(大约3300),我想查询具有该ID的子对象的对象。我的类型之间的关系是1到n。我以500为批次进行此操作。

在我的测试中,在Select子句的匿名类型中,我同时拥有ChildTypeChildTypeId。从第5批或第6批开始,我的查询返回错误结果。批次按顺序运行。

我正在使用.Net 4.6.1,EF6,DevArt 9.4.326和Oracle 12c。

我将只发布我的代码摘要。

数据库架构:

CREATE TABLE PARENT_TYPE
(
  "FK_CHLID_TYPE_ID" NUMBER(38,0) NOT NULL
)

CREATE TABLE CHILD_TYPE
(
  "ID" NUMBER(38,0) NOT NULL
)

C#代码:

public class ChildType
{
  public long Id { get; set; }
}

public class ParentType
{
  public ChildType ChildType { get; set; }
}

public void ProcessBatch(ISystemDataAccess dataAccess, long[] idsBatch)
{
  var queryResult = dataAccess.GetQuery<ParentType>()
                      .Where(p => idsBatch.Contains(p.ChildType.Id))
                      .Select(p => new
                      {
                        ChildId = p.ChildType.Id,
                        Child = p.ChildType,
                      }).ToList();

  if (queryResult.Any(qr => qr.ChildId != qr.Child.Id))
  {
    Debugger.Launch(); // will run in the 5th or 6th batch
  }
}

在第5批或第6批调试期间,将启动调试器。

一些评论: db中的数据是一致的,不会导致错误的结果。 错误的结果在匿名类型的Child属性中,并且在运行之间有所不同。匿名类型的ChildId始终是预期的。 如果我在Select子句中使用特定类型,则仍然会出现问题。

有人经历过类似的事情吗?是由EF还是DevArt结合contains()引起的? 解决方案是仅使用Id,但我想知道是什么原因引起的。

0 个答案:

没有答案