是否可以通过接口查询EF并获取其具体类型的可投射数据?
让我说我得到了:
public interface IBaseBlock
{
int Id { get; set; }
string Name { get; set; }
}
public class ContentBlock : IBaseBlock
{
public int Id { get; set; }
public string Name { get; set; }
public string Content { get; set; }
}
public class VideoBlock : IBaseBlock
{
public int Id { get; set; }
public string Name { get; set; }
string string VideoUrl { get; set; }
}
因此,我希望能够从基于IBaseBlock的实体框架中获取一个列表,然后将它们转换为concret类型以获取其他数据。
现在,我知道可以使用nhibernate(http://stackoverflow.com/questions/3612816/nhibernate-query-all-objects-implementing-an-interface)来完成它,我知道它所做的只是创建一堆SQL查询,但所有在一个数据库中往返。在发出查询时我也不太关心其他数据(我不想添加wheres和order by等)我只需要按公共字段(Id和Name)进行过滤。 / p>
由于
答案 0 :(得分:1)
实体框架不支持按接口查询(EF根本不支持接口)。它仅支持映射实体继承。要使其工作,您必须将IBaseBlock
接口更改为BaseBlock
抽象类和映射继承(可能是TPC)。使用继承还有一些其他缺陷。例如,任何实体的主键在整个继承树中必须是唯一的。
作为附注,EF目前不支持单个往返中的多个查询,因此在查询继承树时,它会创建一个带有联合的大查询。