.NET 4.8中使用LINQ to SQL映射继承类的问题
解决System.Data.Linq映射继承类时父类属性无法识别的问题
这个错误的根源是System.Data.Linq的ExecuteQuery<T>默认不会自动识别继承层次中的父类属性,必须通过明确配置或手动映射来让它正确处理继承类的成员映射。
方案一:通过属性配置继承映射
给父类添加[Table]和[InheritanceMapping]属性,同时给每个属性标记[Column],让DataContext能识别整个继承层次的映射关系:
using System.Data.Linq.Mapping; [Table] // 指定默认子类为ChildClass,Code值可随意设置(因为SQL中没有判别器字段) [InheritanceMapping(Code = "Child", Type = typeof(ChildClass), IsDefault = true)] public class ParentClass { [Column] public int ID { get; set; } [Column] public string Name { get; set; } } public class ChildClass : ParentClass { [Column] public int ChildID { get; set; } }
修改后的代码可以直接使用原有的ExecuteQuery<ChildClass>调用,DataContext会自动映射父类和子类的所有属性。
方案二:手动投影转换
如果不想修改实体类的属性标记,可以先查询到动态类型,再手动转换为ChildClass对象,跳过DataContext的自动映射逻辑:
public void GetDataList() { try { using (var db = new DataContext(connectionString)) { string strSQL = "select 1 as ID, 'test' as Name, 5 as ChildID"; // 先查询为动态类型 var tempResult = db.ExecuteQuery<dynamic>(strSQL); // 手动映射到ChildClass var ic1 = tempResult.Select(item => new ChildClass { ID = item.ID, Name = item.Name, ChildID = item.ChildID }).ToList(); } } catch (Exception ex) { // 这里可以添加异常处理逻辑 } }
这种方式不需要修改实体类,完全手动控制属性映射,适合不想引入DataLinq属性标记的场景。
内容的提问来源于stack exchange,提问作者Anuj Karki
相关产品推荐
相关产品推荐

