如何使用Entity Framework Core填充List<IDocument>接口类型列表
问题描述
我希望复用一个列表来处理特定数据表,因此让实体类实现了IDocument接口,代码如下:
public partial class databaseTable : IDocument
当我尝试填充该接口类型的列表:
public List<IDocument> DocumentList { get; set; }
使用以下代码时,出现编译器错误CS0029:
Cannot implicitly convert type 'type' to 'type'
尝试的代码1:
DocumentList = dbcxt.databaseTable.ToList();
尝试的代码2:
DocumentList = dbcxt.databaseTable .Select(x => new ITegDbDocument // 本来就没指望这个能成... { Id = x.Id, }) .ToList();
请问是否有办法通过Entity Framework Core从数据库表填充接口类型的列表?
解决方案
当然可以实现,以下是几种可行的实用方式:
方式1:显式转换列表类型
因为databaseTable已经实现了IDocument,EF Core查询出的每个databaseTable实例本身就是IDocument的合法实现,只需将列表整体转换类型即可:
// 使用Cast<T>直接转换类型 DocumentList = dbcxt.databaseTable.Cast<IDocument>().ToList(); // 若存在继承关系或需要过滤有效实现类,可使用OfType<T> DocumentList = dbcxt.databaseTable.OfType<IDocument>().ToList();
方式2:投影到实现接口的DTO(如需解耦实体)
如果不想直接使用数据库实体实例,可定义一个实现IDocument的DTO类,通过投影转换数据:
// 先定义实现接口的DTO public class DocumentDto : IDocument { public int Id { get; set; } // 实现IDocument接口的其他属性 } // 投影转换并转为接口列表 DocumentList = dbcxt.databaseTable .Select(x => new DocumentDto { Id = x.Id, // 映射其他需要的属性 }) .ToList<IDocument>();
注意:接口无法直接实例化,你之前尝试new ITegDbDocument的写法本身就是错误的,必须使用实现了接口的具体类。
方式3:使用ConvertAll转换(便捷写法)
如果已经获取到实体列表,也可以用ConvertAll方法逐个转换类型:
DocumentList = dbcxt.databaseTable.ToList().ConvertAll(doc => (IDocument)doc);
内容的提问来源于stack exchange,提问作者Mister 832
相关产品推荐
相关产品推荐

