用Linq和Dataview筛选查询DataTable数据,DataTable和List相互转换
2012-05-15 15:36
609 查看
DataTable 的筛选如果直接用select方法返回的是DataRow[]数组,不适合我们再次利用DataTable,
利用DataView可以通过如下方式实现查询结果直接为DataTable:
引用System.Data.DataExtenstion命名空间:
var result=from r in dt.AsEnumable() where r.Field<bool>(“checked”)==true select r;
可以对DataTable的列进行隐藏:
ds.Tables[ "stdinfo "].Columns[ "备注 "].ColumnMapping = MappingType.Hidden;
解决..上面这句语句实现了隐藏[ "备注 "]列的功能.
DataTable可以返回对象列表List,通过linq来实现:
引用命名空间:System.Data.DataSetExtension:
var reslult=from r in dt.AsEnumable() where r.Field<bool>("check")==true select r;
DataTable数据转换到集合类:
List也可以转换成DataTable:
datatable和list的转化:
现在的DataTable慢慢退出历史舞台,主要是有以下几个原因:
1.List<t>是强类型化的,而DataTable不是一般的DataTable,
访问某列时,是通过string的ColumnName来取得的,
比如:string name = dt.Rows[i]["Name"].ToString();
因为是string的列名,存在记错写错的风险,且编译不检查而List<t>,
因为类型化的元素,编程时属性可以有IDE的智能感知来选择,编码更方便。
不容易出错:string name = list[0].Name;
2.Linq的强有力支持,使得操作List<t>有前所未有的快感其实在linq出来之前,
还是DataTable用的多,因为要想过滤数据,可以用DataView,DataTable.Select()等方法。
而List<t>只能是自己写循环,麻烦。Linq出来之后,where,join,group by,order by...等等操作,
对于List<t>的查询真是很便利。
3.DataTable的结构远比List<t>要复杂,内存占用量更大。在有变化的场合下,
DataTable里要维护不同RowState的数据(修改前的和现在的),还有Schema数据List<t>就没有这些累赘,更轻快。所以,Linq+List<t>才使得现在大家越来越倾向使用List<t>而不是DataTable
-------------以上评价来自网络
利用DataView可以通过如下方式实现查询结果直接为DataTable:
DataTable dt = connection.GetOleDbSchemaTable(OleDbSchemaGuid.Primary_Keys, new object[] { null, null }); DataView view = new DataView(); view.Table = dt; view.RowFilter = string.Format("table_name='{0}'", tableName); return view.ToTable();
引用System.Data.DataExtenstion命名空间:
var result=from r in dt.AsEnumable() where r.Field<bool>(“checked”)==true select r;
可以对DataTable的列进行隐藏:
ds.Tables[ "stdinfo "].Columns[ "备注 "].ColumnMapping = MappingType.Hidden;
解决..上面这句语句实现了隐藏[ "备注 "]列的功能.
DataTable可以返回对象列表List,通过linq来实现:
List<ColumnInfo> result = new List<ColumnInfo>(); DataTable dt=DBHelperOleDb.GetColumnInfo(tableName); var a = (from row in dt.AsEnumerable() where 1 == 1 select new { ColumnName = row.Field<string>("COLUMN_NAME"), ColumnOrder = row.Field<string>("CORDINAL_pOSITION"), DefaultVal = row.Field<string>("COLUMN_DEFAULT"), Description = row.Field<string>("DESCRIPTION"), IsIdentity = row.Field<string>("Column_FLAGS"),// IsPrimaryKey = row.Field<string>("Column_FLAGS"),// Length = row.Field<string>("CHARACTER_MAXIMUM_LENGTH"), Nullable = row.Field<string>("IS_NULLABLE"), Precision = row.Field<string>("NUMERIC_PRECISION"), Scale = row.Field<string>("NUMERIC_SCALE"), TypeName = row.Field<string>("DATA_TYPE") }).ToList();
引用命名空间:System.Data.DataSetExtension:
var reslult=from r in dt.AsEnumable() where r.Field<bool>("check")==true select r;
DataTable数据转换到集合类:
/// DataTable 转换为List 集合 /// </summary> /// <typeparam name="TResult">类型</typeparam> /// <param name="dt">DataTable</param> /// <returns></returns> //<类型参数必须是类并且具有无参数的公共构造函数。当与其他约束一起使用时,new()约束必须最后指定。< public static List<TResult> ToList<TResult>(this DataTable dt) where TResult : class,new() { //创建一个属性的列表 List<PropertyInfo> prlist = new List<PropertyInfo>(); //获取TResult的类型实例 反射的入口 Type t = typeof(TResult); //获得TResult 的所有的Public 属性 并找出TResult属性和DataTable的列名称相同的属性(PropertyInfo) 并加入到属性列表 Array.ForEach<PropertyInfo>(t.GetProperties(), p => { if (dt.Columns.IndexOf(p.Name) != -1) prlist.Add(p); }); //创建返回的集合 List<TResult> oblist = new List<TResult>(); foreach (DataRow row in dt.Rows) { //创建TResult的实例 TResult ob = new TResult(); //找到对应的数据,并赋值 prlist.ForEach(p => { if (row[p.Name] != DBNull.Value) p.SetValue(ob, row[p.Name], null); }); //放入到返回的集合中. oblist.Add(ob); } return oblist; }
List也可以转换成DataTable:
/// 将泛类型集合List类转换成DataTable /// </summary> /// <param name="list">泛类型集合</param> /// <returns></returns> public static DataTable ToDataTable<T>(List<T> entitys) { //检查实体集合不能为空 if (entitys == null || entitys.Count < 1) { throw new Exception("需转换的集合为空"); } //取出第一个实体的所有Propertie Type entityType = entitys[0].GetType(); PropertyInfo[] entityProperties = entityType.GetProperties(); //生成DataTable的structure //生产代码中,应将生成的DataTable结构Cache起来,此处略 DataTable dt = new DataTable(); for (int i = 0; i < entityProperties.Length; i++) { //dt.Columns.Add(entityProperties[i].Name, entityProperties[i].PropertyType); dt.Columns.Add(entityProperties[i].Name); } //将所有entity添加到DataTable中 foreach (object entity in entitys) { //检查所有的的实体都为同一类型 if (entity.GetType() != entityType) { throw new Exception("要转换的集合元素类型不一致"); } object[] entityValues = new object[entityProperties.Length]; for (int i = 0; i < entityProperties.Length; i++) { entityValues[i] = entityProperties[i].GetValue(entity, null); } dt.Rows.Add(entityValues); } return dt; }
datatable和list的转化:
现在的DataTable慢慢退出历史舞台,主要是有以下几个原因:
1.List<t>是强类型化的,而DataTable不是一般的DataTable,
访问某列时,是通过string的ColumnName来取得的,
比如:string name = dt.Rows[i]["Name"].ToString();
因为是string的列名,存在记错写错的风险,且编译不检查而List<t>,
因为类型化的元素,编程时属性可以有IDE的智能感知来选择,编码更方便。
不容易出错:string name = list[0].Name;
2.Linq的强有力支持,使得操作List<t>有前所未有的快感其实在linq出来之前,
还是DataTable用的多,因为要想过滤数据,可以用DataView,DataTable.Select()等方法。
而List<t>只能是自己写循环,麻烦。Linq出来之后,where,join,group by,order by...等等操作,
对于List<t>的查询真是很便利。
3.DataTable的结构远比List<t>要复杂,内存占用量更大。在有变化的场合下,
DataTable里要维护不同RowState的数据(修改前的和现在的),还有Schema数据List<t>就没有这些累赘,更轻快。所以,Linq+List<t>才使得现在大家越来越倾向使用List<t>而不是DataTable
-------------以上评价来自网络
相关文章推荐
- c# Json List<T> DataTable 数据相互转换
- c# Json List<T> DataTable 数据相互转换
- c# Json List DataTable 数据相互转换
- c# Json List<T> DataTable 数据相互转换
- c# Json List<T> DataTable 数据相互转换
- c# Json List<T> DataTable 数据相互转换
- c# Json List<T> DataTable 数据相互转换
- Json List<T> DataTable 数据相互转换
- c# Json List<T> DataTable 数据相互转换
- 【积累】LinqToSql复合查询结果转DataTable数据
- C# DataTable 和List之间相互转换的方法
- C# DataTable 和List之间相互转换的方法[转]
- DataView.RowFilter筛选DataTable中的数据
- 使用linq 对 DataTable 中的数据进行 查询 与 分类求合
- LINQ返回DataTable类型 list转dataset 转换为JSON对象
- C# DataTable 和List之间相互转换的方法
- DataTable 和List 相互转换
- List对象转换成DataTable在linq当中很使用
- 关于DataTable与IList和List泛型集合的相互转换在网上总结
- C#中,当从数据库中查询到数据,以DataTable类型返回后,如果需要对DataTable中的数据进行筛选,可以选择下面的方式