将LINQ查询结果转换为ObservableCollection时引发类型转换异常
解决ObservableCollection类型转换异常问题
你遇到的核心问题是LINQ查询返回的是匿名类型集合,无法直接强制转换为ObservableCollection<DatagGridCollection>。匿名类型和你自定义的DatagGridCollection是完全不同的类型,运行时的类型检查会直接抛出异常。
正确的解决方案
修改你的LINQ查询,在select语句中直接创建DatagGridCollection的实例,而不是匿名对象,这样查询结果就是IEnumerable<DatagGridCollection>类型,可以直接传给ObservableCollection的构造函数:
var d = from p in Auditcollectiondata from c in Finalcollectiondata where c.sno == p.sno select new DatagGridCollection { sno = p.sno, AuditID = p.AuditID, claimnumber = p.claimnumber, QueryID = p.QueryID, DateWorked = p.DateWorked, UserID = p.UserID, Line = p.Line, Dos = p.Dos, CPT = p.CPT, Units = p.Units, amtBilled = p.amtBilled, RecoupUnit = p.RecoupUnit, reocupamts = p.reocupamts, ScioNote = p.ScioNote, Linelevelstatus_valuetext = p.Linelevelstatus_valuetext, providerNote = p.providerNote, // 注意实体类属性名是Finalstatus(小写s),查询里的字段是c.FinalStatus(大写S),需对应一致 Finalstatus = c.FinalStatus, final_status_sno = c.ID_finalstatus // 这里假设ID_finalstatus对应实体类的final_status_sno }; // 直接传入IEnumerable即可,无需强制转换 combine_audit_final_collection = new ObservableCollection<DatagGridCollection>(d);
关键注意点
- 确保
select中赋值的属性名和DatagGridCollection类的属性完全匹配(C#是大小写敏感的),避免出现属性未赋值的情况。 ObservableCollection的构造函数原生支持接收IEnumerable<T>类型参数,不需要先转成ObservableCollection再强制转换,这是多余且错误的操作。
备选方案(需分批处理时)
如果数据集很大,或者需要在添加前做额外逻辑处理,可以先创建空集合,再循环添加:
combine_audit_final_collection = new ObservableCollection<DatagGridCollection>(); foreach(var item in d) { // 可添加额外处理,比如设置update属性默认值 item.update = false; combine_audit_final_collection.Add(item); }
这样处理后,你的combine_audit_final_collection就能正常绑定到DataGrid,不会再出现运行时类型转换异常。
内容的提问来源于stack exchange,提问作者Vini
相关产品推荐
相关产品推荐

