这感觉像是(Oracle)EF Core中的一个不寻常的bug,但我还没有找到类似的东西。
为了重现这个问题,让我们假设2个简单的模型作为父节点的属性- Parent、ChildA和ChildB,其中ChildA和ChildB是相同的:
public class Parent
{
public int Id { get; }
public IList<ChildA> childrenA = new List<ChildA>();
public IList<ChildB> childrenB = new List<ChildB>();
}
public class ChildA // or ChildB
{
public int Id { get; }
public int ValueA { get; private set; }
public int ValueB { get; private set; }
public decimal? ValueC { get; private set; }
public decimal? ValueD { get; private set; }
}
我有以下查询:
var parent = dbContext.Set<Parent>.AsNoTracking();
var query = parent.SelectMany(p => p.childrenA.Select(child => new
child.Id,
A = child.ValueA,
B = child.ValueB,
C = child.ValueC,
D = child.ValueD
}).Union(p.childrenB.Where(x => someWhereClause).Select(child => new
child.Id,
A = child.ValueA,
B = child.ValueB,
C = (decimal?) null,
D = (decimal?) null
})));
var queryString = query.ToQueryString();
但是,当在运行时对我的Oracle DB执行此操作时,我会得到以下结果:
ORA-12537:网络会话:文件结束
经调查,是EF Core无法翻译查询导致的:
当两边的匹配列具有不同的存储类型时,无法转换集操作。
其中,如果我将查询分开并调用.ToQueryString()
,则在第二个查询中,D
值似乎被排除在结果SELECT
中。
通过将第二个查询的匿名类型中的(decimal?) null
值更改为实际的列引用,似乎可以正确地添加值,并且查询可以正常工作。
这可能是什么原因造成的,我做错了什么吗?我想故意在查询中隐藏这些值。
当前运行.NET 6.0、Oracle.EntityFrameworkCore@6.21.61、Microsoft.EntityFrameworkCore@6.0.10
先谢谢你了!
1条答案
按热度按时间zrfyljdw1#
这个长期存在的问题仅在EF Core 8中得到解决。
要跟踪的GitHub问题:Set operations over non-entity projections with different facets