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

System.InvalidCastException异常:Linq Table转List失败求助

异常问题:System.InvalidCastException类型转换失败

抛出异常

System.InvalidCastException: 无法将类型为'System.Data.Linq.Table1[SalesWithLinq.DAL.UnitName]'的对象转换为类型'System.Collections.Generic.List1[SalesWithLinq.DAL.UnitName]'。

问题场景

在RepositoryItemLookUpEdit中添加单位名称,离开单元格时保存至数据库,数据已成功存入,但执行类型转换代码时抛出上述异常。

相关代码

窗体类字段

RepositoryItemLookUpEdit repoUOM = new RepositoryItemLookUpEdit(); // 窗体类的字段

窗体加载事件代码

repoUOM.DisplayMember = "Name"; // 窗体加载事件内
repoUOM.ValueMember = "ID"; // 窗体加载事件内
repoUOM.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.Standard; // 窗体加载事件内

ProcessNewValue事件处理代码

private void RepoUOM_ProcessNewValue(object sender, DevExpress.XtraEditors.Controls.ProcessNewValueEventArgs e)
{
    if (e.DisplayValue is string value && value.Trim() != string.Empty)
    {
        var NewObject = new UnitName() { Name = value.Trim() };
        using (var db = new dbDataContext())
        {
            db.UnitNames.InsertOnSubmit(NewObject);
            db.SubmitChanges();
        }

        ((List<UnitName>)repoUOM.DataSource).Add(NewObject); // 此处抛出异常
        e.Handled = true;
    }
}

解决方案

问题根源是repoUOM.DataSource实际为System.Data.Linq.Table<UnitName>类型,并非List<UnitName>,直接强制转换会触发异常,可通过以下两种方式解决:

  1. 初始化时将数据源转为List
    在窗体加载阶段,不要直接绑定db.UnitNames,而是转为List类型后再赋值:
using (var db = new dbDataContext())
{
    repoUOM.DataSource = db.UnitNames.ToList();
}

后续就能直接将repoUOM.DataSource强转为List<UnitName>添加新对象。

  1. 添加新对象后重新绑定数据源
    若不想修改初始化逻辑,可在保存新对象后,重新从数据库获取数据并绑定,同时设置选中项:
// 替换原强制转换代码
using (var db = new dbDataContext())
{
    repoUOM.DataSource = db.UnitNames.ToList();
}
// 选中刚添加的单位
repoUOM.EditValue = NewObject.ID;

第一种方式更高效,避免重复查询数据库;第二种方式适合需要确保数据源与数据库完全同步的场景。

内容的提问来源于stack exchange,提问作者Mohamed Gaber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 04:26:23