我有从Base类驱动的类“ BaseTask ”
任务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原语或枚举类型。
我该如何解决这个问题?
答案 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,因此它具有您想要实现的相同结果。