首页 新闻 搜索 专区 学院

如何将LINQ查询到的结果由匿名类型var转换成DataTable对象

0
悬赏园豆:10 [已解决问题] 解决于 2017-08-08 09:53
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?

T丶MELO的主页 T丶MELO | 初学一级 | 园豆:151
提问于:2017-08-07 11:03
< >
分享
最佳答案
0

可以对现有的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); ...可以这样实现这个扩展://注意这里写成扩展方法的形式,也可以单独调用

收获园豆:10
金琥 | 老鸟四级 |园豆:2570 | 2017-08-07 11:06

能贴一下详细代码片段吗,我写了一个扩展方法

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 | 园豆:151 (初学一级) | 2017-08-07 11:45

@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对象
金琥 | 园豆:2570 (老鸟四级) | 2017-08-07 13:54

@金琥: 已经解决了  ,之前是求和一直报错,现在改为了

   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 | 园豆:151 (初学一级) | 2017-08-07 16:57

@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

金琥 | 园豆:2570 (老鸟四级) | 2017-08-08 09:22
其他回答(1)
0

最笨的方法,新建一个datatable,foreach遍历你的集合,将每条数据转换为datarow插入datatable。

寻找薛定谔的猫 | 园豆:91 (初学一级) | 2017-08-08 08:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册