C# EF Core中合并继承自BaseChat的两个DbSet时遇ArgumentException
问题解决:合并继承自同一抽象类的DbSet时的ArgumentException异常
问题原因
异常提示显示EF尝试调用针对Group类型的Concat方法,但传入的参数是Chat类型的IQueryable,类型不匹配。这是因为直接调用Chats.Concat<BaseChat>(Groups)时,EF的LINQ提供器没能正确处理跨不同派生类型的合并,泛型参数的声明方式无法让EF正确识别要合并的是基类类型的序列。
解决方案
将两个DbSet都先显式转换为IQueryable<BaseChat>,再执行Concat操作,有两种常用写法:
写法一:显式类型转换
public DbSet<Group> Groups { set; get; } public DbSet<Chat> Chats { set; get; } public IQueryable<BaseChat> BaseChats => ((IQueryable<BaseChat>)Chats).Concat((IQueryable<BaseChat>)Groups);
写法二:使用Cast方法
public DbSet<Group> Groups { set; get; } public DbSet<Chat> Chats { set; get; } public IQueryable<BaseChat> BaseChats => Chats.Cast<BaseChat>().Concat(Groups.Cast<BaseChat>());
说明
Cast<BaseChat>()或显式类型转换会将每个派生类型的DbSet转换为基类型的IQueryable,让Concat正确识别要合并的是同一基类型的序列,EF的LINQ提供器也能正确生成对应的SQL查询(对应SQL的UNION ALL逻辑)。
内容的提问来源于stack exchange,提问作者Hossam Fares
相关产品推荐
相关产品推荐

