Entity framework 左外连接实体框架核心1.1.0
我正在尝试使用EF Core 1.1.0实现左连接。我知道早期版本有问题,但我认为现在已经解决了。此外,EF6也出现了同样的问题,所以我认为这是我做错了 我的表格包含一个组织中与其上级相关的职位。我有以下实体模型: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
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
};