Entity framework 左外连接实体框架核心1.1.0

Entity framework 左外连接实体框架核心1.1.0,entity-framework,linq,left-join,Entity Framework,Linq,Left Join,我正在尝试使用EF Core 1.1.0实现左连接。我知道早期版本有问题,但我认为现在已经解决了。此外,EF6也出现了同样的问题,所以我认为这是我做错了 我的表格包含一个组织中与其上级相关的职位。我有以下实体模型: public class Position { public int ID { get; set; } public string JobTitle { get; set; } public int SuperiorID { get; set; } } Su

我正在尝试使用EF Core 1.1.0实现左连接。我知道早期版本有问题,但我认为现在已经解决了。此外,EF6也出现了同样的问题,所以我认为这是我做错了

我的表格包含一个组织中与其上级相关的职位。我有以下实体模型:

public class Position
{
    public int ID { get; set; }
    public string JobTitle { get; set; }
    public int SuperiorID { get; set; }
}
SuperiorID
指向同一表中的另一条记录,如果不适用,则指向零

我有以下视图模型:

public class PositionListViewModel
{
    public Position Position { get; set; }
    public string Superior { get; set; }
}
在LINQPad中运行以下查询时,结果与预期完全一致:

from pos in Positions
join sup in Positions on pos.SuperiorID equals sup.ID into temp
from sup in temp.DefaultIfEmpty()
select new {pos, sup.JobTitle}
但当我在应用程序中尝试此查询时:

var result =
    from pos in _context.Positions
    join sup in _context.Positions on pos.SuperiorID equals sup.ID into temp
    from sup in temp.DefaultIfEmpty()
    select new PositionListViewModel() { Position = pos, Superior = sup.JobTitle };
结果
为空,返回错误
。get\u Items需要调用System.RuntimeType.IsEnumDefined方法,无法在此上下文中调用该方法。无法计算表达式的值。不支持此操作。未知错误:0x80070057
。我无法找到有关此错误的任何信息。如果尝试返回匿名类型,则会出现相同的错误

我可以通过向实体模型添加一个额外的字段
SupTitle
,并使用
.fromSql
,来解决这个问题,但这感觉很尴尬,而且我认为如果我以后想向查询添加额外的连接,这会变得非常糟糕

var result = _context.Positions.FromSql(
    "SELECT [t0].[ID], [t0].[Title], [t0].[SuperiorID], [t1].[Title] AS [SupTitle] " +
    "FROM [Positions] AS [t0] LEFT OUTER JOIN [Positions] AS [t1] " +
    "ON [t0].[SuperiorID] = [t1].[ID]");
如果我通过删除
into
子句和
DefaultIfEmpty()
行使其成为一个内部联接,它会工作,但显然我不会得到
SuperiorID==0的行


我做错什么了吗?如果没有,是否可以运行两个查询并在将结果发送到视图之前合并结果?这样,我就可以运行内部联接,然后附加一个简单的
查询,其中SuperiorID==0
查询。

经过几天的努力,我在发布问题大约十分钟后找到了解决方案

我将实体模型更改为:

public class Position
{
    public int ID { get; set; }
    public string Title { get; set; }
    public Position Superior { get; set; }
}
然后,下面的查询正如我所希望的那样工作:

var result =
    from pos in _context.Positions
    select new PositionListViewModel()
    {
        Position = pos,
        Superior = pos.Superior == null ? "None" : pos.Superior.Title
    };