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
相关产品推荐
相关产品推荐

