无法将类型'x'强制转换为'y'。 LINQ to Entities仅支持转换EDM原语或枚举类型

时间:2017-09-13 09:19:30

标签: c# entity-framework linq casting

我有从Base类驱动的类“ BaseTask

  • 任务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()
        }
        );
    

这部分代码返回以下错误:

  

无法将“任务”类型强制转换为“任务1”。 LINQ to Entities仅支持转换EDM原语或枚举类型。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分: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#。)

答案 1 :(得分:0)

我知道这是一个较老的问题,但在我解决同样的问题时,我终于找到了一个有趣的解决方案。也许它会帮助别人。如果你使用直接强制转换,它不起作用,但如果你使用as语法,EF可以神奇地翻译它。这应该有效,或者至少在我的情况下是这样。

Selector = (t as Task1).Selector,
Task2Property = (t as Task2).Task2Property,
SelectorPosition = (t as Task3).SelectorPosition,

如果类型不正确,则该值为null,因此它具有您想要实现的相同结果。