EF Core迁移中Linq查询IN子句动态传参及匿名类型转IGrouping编译错误解决
解决EF Core Linq查询的编译错误与IN子句实现问题
我来帮你搞定这两个问题,让你的Linq查询和原来的原生SQL功能完全对齐:
1. 修复编译错误(匿名类型转IGrouping<int, UserPurchaseItemAddonWithAmount>)
你的编译错误核心原因是:Linq查询里select的是匿名类型,但字典要求分组的元素是UserPurchaseItemAddonWithAmount类型。原生SQL里Fetch<UserPurchaseItemAddonWithAmount>直接映射到了这个实体,而Linq里你手动构造了匿名对象,导致分组后的IGrouping元素类型不匹配。
解决方法很简单:把select里的匿名类型替换为直接实例化UserPurchaseItemAddonWithAmount,把对应属性一一赋值:
select new UserPurchaseItemAddonWithAmount { Amount = s.Amount, UserPurchaseItemAddonID = f.UserPurchaseItemAddonId, UserPurchaseItemID = f.UserPurchaseItemId, BranchItemVariantID = f.BranchItemVariantId, AddonID = f.AddonId, UserID = f.UserId, IsDeleted = f.IsDeleted, ModifiedOn = f.ModifiedOn, ModifiedBy = f.ModifiedBy, Reason = f.Reason, }
2. 添加IN子句实现原SQL的过滤逻辑
原SQL里的Where UPIA.UserPurchaseItemID in ({...})对应EF Core Linq的Contains方法——你只需要把userPurchaseItems中提取的UserPurchaseItemID集合作为参数传给Contains,加到查询的where条件里即可。
完整修正后的代码
// 先提取要过滤的ID集合,提前提取更清晰,也可以直接嵌入查询中 var targetPurchaseItemIds = userPurchaseItems.Select(s => s.UserPurchaseItemID).ToList(); IDictionary<int, IGrouping<int, UserPurchaseItemAddonWithAmount>> addons = (from f in context.UserPurchaseItemAddons join s in context.ExtraAddons on f.AddonId equals s.AddonId // 添加IN条件过滤,和原生SQL逻辑完全一致 where targetPurchaseItemIds.Contains(f.UserPurchaseItemId) select new UserPurchaseItemAddonWithAmount { Amount = s.Amount, UserPurchaseItemAddonID = f.UserPurchaseItemAddonId, UserPurchaseItemID = f.UserPurchaseItemId, BranchItemVariantID = f.BranchItemVariantId, AddonID = f.AddonId, UserID = f.UserId, IsDeleted = f.IsDeleted, ModifiedOn = f.ModifiedOn, ModifiedBy = f.ModifiedBy, Reason = f.Reason, }) .GroupBy(g => g.UserPurchaseItemID) .ToDictionary(d => d.Key);
额外小提示
如果UserPurchaseItemAddonWithAmount是EF Core的实体类(对应数据库表且有DbSet),你也可以考虑用自动投影简化代码,但当前写法完全匹配原生SQL的执行逻辑,是最稳妥的迁移方式。
内容的提问来源于stack exchange,提问作者Faizan Naeem
相关产品推荐
相关产品推荐

