Linq Mysql GroupBy语句的问题处理

语句如下:
                var resumeList = db.ChannelResume.Where(model);
                var groupValues = resumeList.GroupBy(t => new {t.AgentId, t.AgentName});
                var statistics = groupValues.Select(c => new ResumeStatisticsViewModel()
                {
                    Date = dateSpan,
                    AgentId = c.Key.AgentId,
                    AgentName = c.Key.AgentName,
                    TotalCount = c.Count(),
                    ValidCount = c.Count(k => k.Status == (int)ResumeStatus.Valid)
                });
                try
                {
                    //statistics = statistics.OrderBy(c => c.AgentName);
                    var tmp = statistics.ToList();

                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                    throw;
                }

如上所示,针对GroupBy后的对象直接使用Select最后数据会返回错误,linq解析出来的sql语句中将AgentId,AgentName这两个分组条件没有作为临时表中的字段,导致最后整个sql语句执行报错:“Unknown column ‘GroupBy1.K1‘ in ‘field list‘”

在网上查到了两个地址:

http://bugs.mysql.com/bug.php?id=46742

http://stackoverflow.com/questions/15083627/linq-mysql-group-by-year-month-day-select-year-month-day-count

不过没有看到解决方案。

后来尝试,直接对groupValues变量做foreach循环。

                var resumeList = db.ChannelResume.Where(model);
                var groupValues = resumeList.GroupBy(t => new {t.AgentId, t.AgentName});
                foreach (var item in groupValues)
                {
                    var viewModel = new ResumeStatisticsViewModel()
                    {
                        Date = dateSpan,
                        AgentId = item.Key.AgentId,
                        AgentName = item.Key.AgentName,
                        TotalCount=item.Count(),
                        ValidCount = item.Count(t => t.Status == (int)ResumeStatus.Valid)
                    };
                    result.Add(viewModel);
                }

                return new PagedList<ResumeStatisticsViewModel>(result, m.Page, m.PageSize);

这样正常执行,不报错了。

感觉是Linq Mysql GroupBy语句和Select结合使用存在bug。

后话,linq语句确实存在性能问题,如果不是拆分写代码太啰嗦,真的应该拆分,保持代码中对数据库的操作尽量短平快。

Linq Mysql GroupBy语句的问题处理,布布扣,bubuko.com

时间: 2024-11-01 06:17:06

Linq Mysql GroupBy语句的问题处理的相关文章

LINQ to SQL语句(5)之Order By

Order By操作 适用场景:对查询出的语句进行排序,比如按时间排序 等等. 说明:按指定表达式对集合排序:延迟,:按指定表达式对集合 排序:延迟,默认是升序,加上descending表示降序,对应的扩展方法是 OrderBy和OrderByDescending 1.简单形式 这个例子使用 orderby 按雇用日期对雇员进行排序: var q = from e in db.Employees orderby e.HireDate select e; 说明:默认为升序 2.带条件形式 注意:W

LINQ to SQL语句(1)之Where(抄的好)

Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句. Where操作包括3种形式,分别为简单形式.关系条件形式.First()形式.下面分别用实例举例下: 1.简单形式: 例如:使用where筛选在伦敦的客户 var q = from c in db.Customers where c.City == "London" select c; 再如:筛选1994 年或之后雇用的雇员:

SQL语句对应的LINQ和Lambda语句

1. 查询Student表中的所有记录的Sname.Ssex和Class列.select sname,ssex,class from studentLinq:    from s in Students    select new {        s.SNAME,        s.SSEX,        s.CLASS    }Lambda:    Students.Select( s => new {        SNAME = s.SNAME,SSEX = s.SSEX,CLASS 

LINQ to SQL语句非常详细(原文来自于网络)

LINQ to SQL语句(1)之Where Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句. Where操作包括3种形式,分别为简单形式.关系条件形式.First()形式.下面分别用实例举例下: 1.简单形式: 例如:使用where筛选在伦敦的客户 var q = from c in db.Customers where c.City == "London" select c

[转]Linq中GroupBy方法的使用总结

Linq中GroupBy方法的使用总结 Group在SQL经常使用,通常是对一个字段或者多个字段分组,求其总和,均值等. Linq中的Groupby方法也有这种功能.具体实现看代码: 假设有如下的一个数据集: public class StudentScore { public int ID { set; get; } public string Name { set; get; } public string Course { set; get; } public int Score { se

Mysql常用语句总结

对MySql经常使用语句的详细总结 下面总结的知识点全是经常用的,全都是干货,好好收藏吧./* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限验证登录MySQL */ mysqld --skip-grant-tables -- 修改root密码 密码加密函数password() update mysql.user set password=password('root'); SHOW

LINQ to SQL语句Concat/Union/Intersect/Except--2017年2月22日

Concat/Union/Intersect/Except操作 适用场景:对两个集合的处理,例如追加.合并.取相同项.相交项等等. Concat(连接) 说明:连接不同的集合,不会自动过滤相同项:延迟. 1.简单形式: var q = ( from c in db.Customers select c.Phone ).Concat( from c in db.Customers select c.Fax ).Concat( from e in db.Employees select e.Home

MySQL 查询语句使用进阶

MySQL 查询语句使用进阶 =============================================================================== 概述: =============================================================================== 练习: 练习1  首先导入hellodb.sql的脚本文件,查询其数据库和表如下: [[email protected] ~]# mysql 

MySQL的语句执行顺序

MySQL的语句一共分为11步,如下图所标注的那样,最先执行的总是FROM操作,最后执行的是LIMIT操作.其中每一个操作都会产生一张虚拟的表,这个虚拟的表作为一个处理的输入,只是这些虚拟的表对用户来说是透明的,但是只有最后一个虚拟的表才会被作为结果返回.如果没有在语句中指定某一个子句,那么将会跳过相应的步骤. 下面我们来具体分析一下查询处理的每一个阶段 FORM: 对FROM的左边的表和右边的表计算笛卡尔积.产生虚表VT1 ON: 对虚表VT1进行ON筛选,只有那些符合<join-condit