2016-12-03 110 views
2

我想實現與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查詢。

回答

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 
    };