LINQ Lambda JOIN查询报错:无法将匿名类型#1转换为BRAND_NAME_MAP_ID
解决LINQ Join返回匿名类型导致的类型转换错误
嘿,我太懂刚接触Lambda和LINQ时卡壳的感觉了!这个错误其实很好搞定,核心问题就是返回类型不匹配!
错误原因分析
你的方法声明明确要返回BRAND_NAME_MAP_MASTER类型,但在Join操作的最后,你用(a, b) => new {a, b}创建了一个匿名类型(打包了两个表的实体a和b),C#根本没法把这个匿名对象直接转换成你需要的实体类型,所以就报了"无法将匿名类型#1转换为BRAND_NAME_MAP_ID"的错误。
解决方案分两种情况:
情况1:你只需要PFC_BRAND_NAME_MAP_MASTER的数据
如果Join只是用来做关联过滤,最终只需要主表的实体,那直接在Join的结果选择器里返回a就行:
public BRAND_NAME_MAP_MASTER GetBrandNameBrandNameMapID(int BrandNameMapID) { PFC_BRAND_NAME_MAP_MASTER objBrandNameMap = Db.PFC_BRAND_NAME_MAP_MASTERs .Join(SIRDC.INGREDIENT_BRAND_NAME_MAPs, a => a.BRAND_NAME_MAP_ID, b => b.BRAND_NAME_MAP_ID, (a, b) => a) // 直接返回主表实体,放弃匿名类型 .Where(x => x.BRAND_NAME_MAP_ID == BrandNameMapID) // 补全你的过滤条件 .FirstOrDefault(); // 必须加获取单个实体的方法,比如FirstOrDefault/Single return objBrandNameMap; }
情况2:你需要结合两个表的数据
如果要同时用到两个表的字段,有两种可行方式:
- 自定义DTO类:专门创建一个包含所需字段的类,在Join选择器里返回这个类的实例:
// 先定义DTO,存放你需要的所有字段 public class BrandNameMapDto { public int BrandNameMapId { get; set; } public string MasterBrandName { get; set; } // 主表字段示例 public int IngredientId { get; set; } // 关联表字段示例 } // 修改方法返回类型为DTO public BrandNameMapDto GetBrandNameBrandNameMapID(int BrandNameMapID) { var objBrandNameMap = Db.PFC_BRAND_NAME_MAP_MASTERs .Join(SIRDC.INGREDIENT_BRAND_NAME_MAPs, a => a.BRAND_NAME_MAP_ID, b => b.BRAND_NAME_MAP_ID, (a, b) => new BrandNameMapDto { BrandNameMapId = a.BRAND_NAME_MAP_ID, MasterBrandName = a.BRAND_NAME, IngredientId = b.INGREDIENT_ID }) .Where(x => x.BrandNameMapId == BrandNameMapID) .FirstOrDefault(); return objBrandNameMap; } - 映射到现有实体(不推荐):如果必须返回
BRAND_NAME_MAP_MASTER,得确保这个实体有能存储关联表字段的属性,然后在选择器里把b的字段赋值给a的对应属性,但这种方式会打破实体和单表的对应关系,一般不建议。
额外小提醒
LINQ查询的结果默认是IQueryable<T>集合类型,必须加上FirstOrDefault()、Single()这类方法把它转换成单个实体,不然也没法直接赋值给你的实体变量哦!
内容的提问来源于stack exchange,提问作者Programmermid
相关产品推荐
相关产品推荐

