You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:54:57