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

Linq-to-SQL查询在VS2017报Invalid Cast错误,求解决方案

解决VS2017中ListBox赋值ItemsSource时的Invalid Cast错误

这个问题大概率是因为VS2017对应的.NET/WPF版本对数据绑定的类型兼容性支持不如VS2019,IOrderedQueryable<T>这种延迟执行的查询类型在旧版本的绑定引擎里无法直接转换为ListBox所需的数据源类型。

快速解决方案

把查询结果转换成具体的集合类型(比如List<T>),强制立即执行查询,这样就能避免类型转换错误。修改代码有两种方式:

方式1:在查询末尾添加ToList()

private void GetArticles() {
 DataClasses1DataContext dc = new DataClasses1DataContext();
 // 转换为List<FICHES_ARTICLES>,立即执行查询
 var art = (from a in dc.PESEES join p in dc.FICHES_ARTICLES on a.ART_CODE equals p.ART_CODE where a.PESEE_ST == 0 select p).Distinct().OrderBy(x => x.ART_LIBELLE1).ToList();
 ArtListBox.ItemsSource = art;
 ArtListBox.DisplayMemberPath = "ART_LIBELLE1";
 ArtListBox.SelectedValuePath = "ART_CODE";
}

方式2:在赋值时转换

private void GetArticles() {
 DataClasses1DataContext dc = new DataClasses1DataContext();
 IOrderedQueryable<FICHES_ARTICLES> art = (from a in dc.PESEES join p in dc.FICHES_ARTICLES on a.ART_CODE equals p.ART_CODE where a.PESEE_ST == 0 select p).Distinct().OrderBy(x => x.ART_LIBELLE1);
 // 赋值时转换为List
 ArtListBox.ItemsSource = art.ToList();
 ArtListBox.DisplayMemberPath = "ART_LIBELLE1";
 ArtListBox.SelectedValuePath = "ART_CODE";
}

原因解释

VS2019及对应的新版本.NET/WPF对数据绑定的类型适配做了优化,能够直接处理IOrderedQueryable<T>这种实现了IEnumerable<T>的延迟查询类型;但VS2017使用的旧版本绑定引擎无法正确识别这种延迟执行的查询类型,导致类型转换失败。通过调用ToList(),我们把延迟查询转换成了内存中的List<T>集合,这是绑定引擎可以直接识别的类型,自然就解决了Invalid Cast错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:36:22