標籤:style blog http color 使用 io 資料 for
語句如下:
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語句確實存在效能問題,如果不是拆分寫代碼太囉嗦,真的應該拆分,保持代碼中對資料庫的操作盡量短平快。