问题描述
下面的代码是没有问题的,可以正常绑定数据源using(IDbConnectionconn=DbProviderFactories.GetFactory(connStr.ProviderName).CreateConnection()){conn.ConnectionString=connStr.ConnectionString;varsql="select*fromEMP,DEPTwhereEMP.deptno=DEPT.deptno";varlist=conn.Query<Model.EMP,Model.DEPT,Model.EMP>(sql,(EMP,DEPT)=>{returnEMP;},null,null,true,"DEPTNO");if(list.Count()==0){MessageBox.Show("没有查询到数据!");return;}dataGridViewDemo.DataSource=list;}
可是我如果用Query()方法的另一个重载,DataGridView上却什么数据也不显示,设置断点list已经有值,说明已经查询到数据了,可就是绑定不成功。EMP表和DEPT表的实体我都已经建好了。list.ToList()也不行,其实list本身就已经实现了IEnumerable接口可以直接绑定的。using(IDbConnectionconn=DbProviderFactories.GetFactory(connStr.ProviderName).CreateConnection()){conn.ConnectionString=connStr.ConnectionString;varlist=conn.Query("selectEMP.*fromEMP,DEPTwhereEMP.deptno=DEPT.deptno");if(list.Count()==0){MessageBox.Show("没有查询到数据!");return;}dataGridViewDemo.DataSource=list;}
解决方案
解决方案二:
自己顶一下。。
解决方案三:
直接Query而不指定Type时,返回的是dynamic吧,这时候你先确认下通过xxx.YYY能取到数据吗,然后这个适用于数据绑定吗?
解决方案四:
引用2楼starfd的回复:
直接Query而不指定Type时,返回的是dynamic吧,这时候你先确认下通过xxx.YYY能取到数据吗,然后这个适用于数据绑定吗?
恩,是dynamic,list[0].XXX是没有属性的智能提示的可是两种方式不是都返回dynamic数据吗,为什么第二种就绑定不上数据呢?
解决方案五:
实体返回时,绑定的数据取法应该是从属性获取,你要不试验下实体里面的某个属性改成字段,看数据能不能被绑定上,dynamic的那个说实话我也不知道它是个啥东西,获取到的是属性还是字段呢?
解决方案六:
其实获取数据的是Dapperrow类型的
解决方案七:
引用4楼starfd的回复:
实体返回时,绑定的数据取法应该是从属性获取,你要不试验下实体里面的某个属性改成字段,看数据能不能被绑定上,dynamic的那个说实话我也不知道它是个啥东西,获取到的是属性还是字段呢?
网上找了一段话引用
DataGridView的DataSource属性为object类型,但并不意味着任何类型都可以作为DataGridView的数据源。DataGridView的数据源必须是实现以下接口的任意类型:(1)IList接口,包括一维数组。(2)IListSource接口,例如,DataTable和DataSet类。(3)IBindingList接口,例如,BindingList<T>类。(4)IBindingListView接口,例如,BindingSource类。而LINQ查询结果为IEnumerable<T>或IQueryable<T>类型,如果直接作为数据源绑定到DataGridView,将无法显示任何内容。Enumerable类为IEnumerable<T>接口定义了一系列扩展方法,其中的ToList<T>方法可以将IEnumerable<T>转换为List<T>。这样,就可以绑定到DataGridView了
而我即使将结果ToList()后再设置数据源,DataGridView仍然不显示任何数据。
解决方案八:
你查到的是首要条件,然后根据这个会有后续取值逻辑,估计IList的话是用的属性取值
解决方案九:
引用7楼starfd的回复:
你查到的是首要条件,然后根据这个会有后续取值逻辑,估计IList的话是用的属性取值
不知道怎么改代码?