无法将类型'x'转换为类型'y'。LINQ to Entities仅支持将EDM基元类型或枚举类型进行转换。

3

我有一些从基类 "BaseTask" 派生出的类。

  • Task1
  • Task2
  • Task3

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

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

无法将类型“Task”强制转换为类型“Task1”。LINQ to Entities 仅支持将 EDM 原始或枚举类型进行强制转换。

我该如何解决这个问题?


在将IQueryable实现化之后执行DTO转换。 - ASpirin
2个回答

1

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

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

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

这对我来说真是救命稻草,谢谢你发布这个! - SpaceOgre

1
据我所知,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是每个属性的适当类型(如果您仍在使用旧版C#,则=>{ get { return x; } }的简写形式)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接