求linq;在group by 的分组依据为多个字段的情况下

时间:2021-01-24 15:10:30
在sql中group by 的分类,可以根据多个字段组合;
但是在linq中怎么实现了?

customerid, productid,sellNum   sellTime ;


select customerid, productid,SUM(sellNum)
from table1
group by ustomerid, productid
having SUM(sellNum) > 10 

12 个解决方案

#1



            var ary = from t in list
                       group t by new { t.ustomerid, t.productid } into g
                       select new { key = g.Key, source = g};

类似这样

#2


引用 1 楼 xdashewan 的回复:

            var ary = from t in list
                       group t by new { t.ustomerid, t.productid } into g
                       select new { key = g.Key, source = g};

类似这样

求linq;在group by 的分组依据为多个字段的情况下求linq;在group by 的分组依据为多个字段的情况下
高手,这样ok;不过有遇到其他问题。
最后应用linq的实体是个DataTable,
                //DataTable aTable
                var q =
                    from p in aTable.Select().ToList()
                    group p by new { p[1],p[2]} into g
                    where g.Count()>1
                    select  new { key = g.Key, source = g};

这样写好像有问题

#3


引用 2 楼 caozhangcaoluo 的回复:
这样写好像有问题

var q =
                    from p in aTable.AsEnumerable()

#4


 var query = from s in table1
                        group s by new { s.customerid, s.productid} into g
                        where Sum(sellNum) > 10 
                        select new
                        {
                            customerid = g.Key.customerid ,
                            productid = g.Key.productid,
                            totalNum = g.Sum(s => s.sellNum)
                        };

#5



 a.GroupBy(x => x.ustomerid + x.productid).ToList();



就这样就可以了

#6


 var query = from s in table1
                        group s by new { s.customerid, s.productid} into g
                        where g.Sum(s => s.sellNum) > 10
                        select new
                        {
                            customerid = g.Key.customerid ,
                            productid = g.Key.productid,
                            totalNum = g.Sum(s => s.sellNum)
                        }; 

#7


发帖的时候引用的表结构是为了,能够简单的描述问题。
实际中的问题时,表对象是一个DataTable,直接从Excel中读取的。列名称不确定,值类型全部类字符串;

需要进行分组的列有几列,那几列,都是动态的。


//DataTable aTable; 数据源
//List<string> pkList;分组的列名称
//需要查询出:按照pkList分组,count(1)>1的所有记录

#8


引用 6 楼 u010349035 的回复:
 var query = from s in table1
 


引用 5 楼 lyj224170707 的回复:


发帖的时候引用的表结构是为了,能够简单的描述问题。
实际中的问题时,表对象是一个DataTable,直接从Excel中读取的。列名称不确定,值类型全部类字符串;

需要进行分组的列有几列,哪几列,都是动态的。

//DataTable aTable; 数据源
//List<string> pkList;分组的列名称
//需要查询出:按照pkList分组,count(1)>1的所有记录

#9


Quote: 引用 7 楼 caozhangcaoluo 的回复:

发帖的时候引用的表结构是为了,能够简单的描述问题。
实际中的问题时,表对象是一个DataTable,直接从Excel中读取的。列名称不确定,值类型全部类字符串;
Quote:

你可以在读取完数据后,先把数据调整到一个固定列的集合里,然后再做分页啊

#10


引用 9 楼 xdashewan 的回复:
Quote: 引用 7 楼 caozhangcaoluo 的回复:

发帖的时候引用的表结构是为了,能够简单的描述问题。
实际中的问题时,表对象是一个DataTable,直接从Excel中读取的。列名称不确定,值类型全部类字符串;
Quote:

你可以在读取完数据后,先把数据调整到一个固定列的集合里,然后再做分页啊


是指定义对应的class来处理吗?


#11


引用 10 楼 caozhangcaoluo 的回复:
是指定义对应的class来处理吗?

不管是类也好,table也好,只要列能确定下来不就能分组了吗

#12




DataTable aTable = new DataTable();
        var result = aTable.Rows.Cast<DataRow>().GroupBy(x => x["ustomerid"].ToString() + x["productid"].ToString()).Where(x =>
        {
            var sum = x.Sum(y => Convert.ToInt32(y["sellNum"]));
            return sum > 10;
        });

        foreach (var thisGroup in result)
        {
            string thisKey = thisGroup.Key;//这组的名字,也就是x["ustomerid"].ToString() + x["productid"].ToString()
            foreach (var temp in thisGroup)
            {
                //遍历当前这组的所有信息
            }
        }



懒得填数据测试了。。肯定没错

#1



            var ary = from t in list
                       group t by new { t.ustomerid, t.productid } into g
                       select new { key = g.Key, source = g};

类似这样

#2


引用 1 楼 xdashewan 的回复:

            var ary = from t in list
                       group t by new { t.ustomerid, t.productid } into g
                       select new { key = g.Key, source = g};

类似这样

求linq;在group by 的分组依据为多个字段的情况下求linq;在group by 的分组依据为多个字段的情况下
高手,这样ok;不过有遇到其他问题。
最后应用linq的实体是个DataTable,
                //DataTable aTable
                var q =
                    from p in aTable.Select().ToList()
                    group p by new { p[1],p[2]} into g
                    where g.Count()>1
                    select  new { key = g.Key, source = g};

这样写好像有问题

#3


引用 2 楼 caozhangcaoluo 的回复:
这样写好像有问题

var q =
                    from p in aTable.AsEnumerable()

#4


 var query = from s in table1
                        group s by new { s.customerid, s.productid} into g
                        where Sum(sellNum) > 10 
                        select new
                        {
                            customerid = g.Key.customerid ,
                            productid = g.Key.productid,
                            totalNum = g.Sum(s => s.sellNum)
                        };

#5



 a.GroupBy(x => x.ustomerid + x.productid).ToList();



就这样就可以了

#6


 var query = from s in table1
                        group s by new { s.customerid, s.productid} into g
                        where g.Sum(s => s.sellNum) > 10
                        select new
                        {
                            customerid = g.Key.customerid ,
                            productid = g.Key.productid,
                            totalNum = g.Sum(s => s.sellNum)
                        }; 

#7


发帖的时候引用的表结构是为了,能够简单的描述问题。
实际中的问题时,表对象是一个DataTable,直接从Excel中读取的。列名称不确定,值类型全部类字符串;

需要进行分组的列有几列,那几列,都是动态的。


//DataTable aTable; 数据源
//List<string> pkList;分组的列名称
//需要查询出:按照pkList分组,count(1)>1的所有记录

#8


引用 6 楼 u010349035 的回复:
 var query = from s in table1
 


引用 5 楼 lyj224170707 的回复:


发帖的时候引用的表结构是为了,能够简单的描述问题。
实际中的问题时,表对象是一个DataTable,直接从Excel中读取的。列名称不确定,值类型全部类字符串;

需要进行分组的列有几列,哪几列,都是动态的。

//DataTable aTable; 数据源
//List<string> pkList;分组的列名称
//需要查询出:按照pkList分组,count(1)>1的所有记录

#9


Quote: 引用 7 楼 caozhangcaoluo 的回复:

发帖的时候引用的表结构是为了,能够简单的描述问题。
实际中的问题时,表对象是一个DataTable,直接从Excel中读取的。列名称不确定,值类型全部类字符串;
Quote:

你可以在读取完数据后,先把数据调整到一个固定列的集合里,然后再做分页啊

#10


引用 9 楼 xdashewan 的回复:
Quote: 引用 7 楼 caozhangcaoluo 的回复:

发帖的时候引用的表结构是为了,能够简单的描述问题。
实际中的问题时,表对象是一个DataTable,直接从Excel中读取的。列名称不确定,值类型全部类字符串;
Quote:

你可以在读取完数据后,先把数据调整到一个固定列的集合里,然后再做分页啊


是指定义对应的class来处理吗?


#11


引用 10 楼 caozhangcaoluo 的回复:
是指定义对应的class来处理吗?

不管是类也好,table也好,只要列能确定下来不就能分组了吗

#12




DataTable aTable = new DataTable();
        var result = aTable.Rows.Cast<DataRow>().GroupBy(x => x["ustomerid"].ToString() + x["productid"].ToString()).Where(x =>
        {
            var sum = x.Sum(y => Convert.ToInt32(y["sellNum"]));
            return sum > 10;
        });

        foreach (var thisGroup in result)
        {
            string thisKey = thisGroup.Key;//这组的名字,也就是x["ustomerid"].ToString() + x["productid"].ToString()
            foreach (var temp in thisGroup)
            {
                //遍历当前这组的所有信息
            }
        }



懒得填数据测试了。。肯定没错