我有一个相对简单的查询,它返回不一致的结果。
具有ID的集合(大约3300),我想查询具有该ID的子对象的对象。我的类型之间的关系是1到n。我以500为批次进行此操作。
在我的测试中,在Select子句的匿名类型中,我同时拥有ChildType
和ChildTypeId
。从第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,但我想知道是什么原因引起的。