我想實現與EF核心1.1.0左連接。我知道早期版本存在問題,但我認爲現在已經修復了。另外,EF6也出現了同樣的問題,所以我認爲這是我做錯的事情。左外連接實體框架核心1.1.0
我的表格包含組織中對上級的引用。我有以下實體模型:
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 };
result
爲空並返回錯誤.get_Items requires calling method System.RuntimeType.IsEnumDefined, which cannot be called in this context. Unable to evaluate the expression. Operation not supported. Unknown error: 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
。
我做錯了什麼?如果沒有,我可以運行兩個查詢並在將結果發送到視圖前合併結果?這樣,我可以運行內連接,然後附加一個簡單的where SuperiorID == 0
查詢。