2014-09-19 104 views
1
列出 亞型

考慮三類:鑄造在LINQ到實體查詢

public class MyChildDto 
{ 
    public int Id {get; set;} 
    public string Name {get; set;} 
} 

public class MyChildDtos : List<MyChildDto> 
{ 
    public MyChildDtos(List<MyChildDto> myChildDtos) 
     : base(myChildDtos) 
    { 
    } 
} 

public class MyParentDto 
{ 
    public int Id {get; set;} 
    public MyChildDtos Children {get; set;} 
} 

我也有實體的集合,我想查詢和映射到父對象,像這樣:

public MyParentDto GetParentDto(int id) 
{ 
    return DbContext.MyParentEntities.Select(p => new MyParentDto 
     { 
      Id = p.Id, 
      Children = p.MyChildEntities.Select(c => new MyChildDto 
      { 
       Id = c.Id, 
       Name = c.Name 
      }).ToList() 
     }); 
} 

(假設爲參數的緣故所需要的MyChildDtos類;我只呈現一個簡化的例子。)

我遇到的問題是轉換的0的結果選擇適當的類型。使用上面的代碼,我收到一個錯誤,該類型不能隱式轉換(從List<MyChildDto>MyChildDtos),但存在明確的轉換。但是,當我嘗試顯式轉換時,我收到一個錯誤,「LINQ to Entities只支持投射EDM原語或枚舉類型」。同樣,如果我試圖明確構建MyChildDtos列表(即將選擇結果傳遞到ctor),我會收到一個錯誤,表示Linq-to-Entities只支持使用查詢中的默認構造函數。

是否有某種方法可以將List<MyChildDto>結果從Linq-to-Entities查詢中轉換爲MyChildDtosList<MyChildDto>子類型)?

+0

你試過超載隱式轉換操作符? (即公共靜態隱式操作符MyChildDtos(List item){return new MyChildDtos(item);}) – dodald 2014-09-19 20:05:10

回答

7

你只是不應該有第一個MyChildDtos類型。這裏沒有增加任何價值。父類型應該僅僅作爲一種List鍵入Children

public class MyParentDto 
{ 
    public int Id {get; set;} 
    public List<MyChildDto> Children {get; set;} 
} 
+0

因爲我爲了舉例簡化了代碼;爲了論證的緣故,假設MyChildDtos是必要的。 – Andrew 2014-09-19 17:24:18

+2

@Andrew你應該沒有必要。找到一種方法來完成這個類型正在做的事情,而不需要繼承'List'。正如你已經看到了你自己,你完全不能使用它的類型,因爲它坐。不知道你的實際問題是什麼,我們沒有辦法解釋你應該怎樣去解決它。 – Servy 2014-09-19 17:25:12