oracle 匿名类型不匹配的EF Core Union查询

iyzzxitl  于 2023-04-20  发布在  Oracle
关注(0)|答案(1)|浏览(135)

这感觉像是(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
先谢谢你了!

zrfyljdw

zrfyljdw1#

这个长期存在的问题仅在EF Core 8中得到解决。
要跟踪的GitHub问题:Set operations over non-entity projections with different facets

相关问题