1 var query = table.AsEnumerable().GroupBy(d => new { MATERIAL_CODE = d.Field<string>("MATERIAL_CODE") }).Select(g => new { MATERIAL_CODE = g.Key.MATERIAL_CODE, STORAGE_NUM = g.Sum(d => d.Field<int>("STORAGE_NUM")) });
我通过PDA导入了一个datatable,是一个入库记录,然后通过入库记录增加库存,但是一个物料可能有多条入库记录,这样就需要把这几条记录的数量“STORAGE_NUM”进行汇总,我采用linq查询把datatable通过筛选,怎么再把上述的query转化成datatable?
可以对现有的IQueryable 接口进行扩展 ,之后就可以使用这样得调用:DataContext db = new DataContext (); //具体请使用你自己的 DataContext 实现的对象。DataTable dt=new DataTable();var query = from u in db.Users where u.RoleID ==3 select u; //得到 IQueryable 对象 //这样调用dt= query.ToDataTable(db); ...可以这样实现这个扩展://注意这里写成扩展方法的形式,也可以单独调用
能贴一下详细代码片段吗,我写了一个扩展方法
public class Material { public string MatCode { get; set; } public int Num { get; set; } } public static class Extension { public static DataTable CopyToDataTable<T>(this IEnumerable<T> array) { var ret = new DataTable(); foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T))) // if (!dp.IsReadOnly) ret.Columns.Add(dp.Name, dp.PropertyType); foreach (T item in array) { var Row = ret.NewRow(); foreach (PropertyDescriptor dp in TypeDescriptor.GetProperties(typeof(T))) // if (!dp.IsReadOnly) Row[dp.Name] = dp.GetValue(item); ret.Rows.Add(Row); } return ret; } }
但是在foreach (T item in array)时报错
@T丶MELO:
DataTable dt=new DataTable(); var query = from u in db.Users where u.RoleID ==3 select u; //定义查询出的linq语句 dt= query.ToDataTable(db); //把linq语句转换成dataTable对象
@金琥: 已经解决了 ,之前是求和一直报错,现在改为了
var query = dt.Rows.Cast<DataRow>().GroupBy<DataRow, string>( row => Convert.ToString(row["MATERIAL_CODE"])).Select( group => new { group.Key, Value = group.Sum(x => Convert.ToInt32(x["STORAGE_NUM"])) });
sum就没有报出转化错误了,不知道dt.Rows.Cast<DataRow>()和dt.AsEnumerable()有什么区别呢?大神
@T丶MELO:
var rows= dt.Rows.Cast<DataRow>()
得到一个IEnumerable<DataRow>
参考:https://zhidao.baidu.com/question/203078431362996365.html
AsEnumerable() 是 LINQ TO OBJECT
参考:http://www.mamicode.com/info-detail-1315793.html
最笨的方法,新建一个datatable,foreach遍历你的集合,将每条数据转换为datarow插入datatable。