2017-09-13 29 views
1

我有從基類驅動類 「BaseTask無法將類型'x'轉換爲輸入'y'。 LINQ到實體僅支持澆鑄EDM原語或枚舉類型

  • 任務1
  • 任務2
  • 任務3

    return DbContext.Projects.Include(t => t.Tasks).Select(p => new ProjectDto 
        { 
         Id = p.Id, 
         Name = p.Name, 
         Tasks = p.Tasks.Select(t => new TaskDto() 
         { 
          Id = t.Id, 
          Name = t.Name, 
          ProjectId = t.ProjectId, 
          Selector = !(t is Task1) ? t.Selector : null, 
          Task2Property = (t is Task2) ? ((Task2)t).Task2Property : null, 
          SelectorPosition = (t is Task3) ? ((Task3)t).SelectorPosition : null, 
          KeyId = t.KeyId 
         }).ToList() 
        } 
        ); 
    

這部分代碼返回以下錯誤:

Unable to cast the type 'Task' to type 'Task1'. LINQ to Entities only supports casting EDM primitive or enumeration types.

我該如何解決這個問題?

+0

Materialiaing'IQueryable'後執行DTO轉換工作謝謝 – ASpirin

回答

1

AFAIK EF不可能這樣做,因爲EF無法將其轉換爲SQL。但也許一個小的結構變化將有助於:

return DbContext.Projects.Include(t => t.Tasks).Select(p => new ProjectDto 
    { 
     Id = p.Id, 
     Name = p.Name, 
     Tasks = p.Tasks.Select(t => new TaskDto() 
     { 
      Id = t.Id, 
      Name = t.Name, 
      ProjectId = t.ProjectId, 
      Task = t, 
      KeyId = t.KeyId 
     }).ToList() 
    }); 

,並在TaskDto

public X Selector => (Task as Task1)?.Selector; 
public X Task2Property => (Task as Task2)?.Task2Property; 
public X SelectorPosition => (Task as Task3)?.SelectorPosition; 

哪裏X是合適的類型,每個屬性(和=>{ get { return x; } }的縮寫形式,如果你還在使用舊版本的C#)。

+0

感謝 – akd

相關問題