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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:43:37