Description:
When performing a Where -> GroupBy -> OrderBy, -> Take() -> ToList(), the OrderBy column is transposed in the final derived table in SQL.
Notice column C1
How to repeat:
***************
SQL TABLES
***************
CREATE TABLE `fact_web_session_summary` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`date_id` INT(11) NOT NULL,
`web_profile_id` INT(11) NOT NULL,
`web_visitor_location_id` INT(11) NOT NULL,
`web_platform_device_id` INT(11) NOT NULL,
`web_source_id` INT(11) NOT NULL,
`web_session_flags_id` INT(11) NOT NULL,
`page_views` INT(11) NOT NULL,
`hits` INT(11) NOT NULL,
`users` INT(11) NOT NULL,
`new_users` INT(11) NOT NULL,
`sessions` INT(11) NOT NULL,
`bounces` INT(11) NOT NULL,
`duration` INT(11) NOT NULL
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
CREATE TABLE `dim_web_source` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`source` VARCHAR(200) NOT NULL,
`medium` VARCHAR(200) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
---------------------------------
***************
MODELS FOR DB CONTEXT
***************
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test {
public class fact_web_session_summary {
public int id { get; set; }
public int duration { get; set; }
public int bounces { get; set; }
public int sessions { get; set; }
public int new_users { get; set; }
public int users { get; set; }
public int page_views { get; set; }
public int hits { get; set; }
public int web_source_id { get; set; }
public virtual dim_web_source web_source { get; set; }
public int date_id { get; set; }
public virtual dim_date date { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Test {
public class dim_web_source {
public int id { get; set; }
public string source { get; set; }
public string medium { get; set; }
public virtual ICollection<fact_web_session_summary> web_session_summaries { get; set; }
}
}
--------------------------------
***************
LINQ STATEMENT
***************
var startDate = Convert.ToDateTime("01/01/2015");
var endDate = Convert.ToDateTime("10/01/2015");
dbContext.fact_web_session_summary
.Where(o => o.dim_date.date >= startDate && o.dim_date <= endDate)
.GroupBy(o => o.web_source.source)
.Select(o => new {
Source = o.Key,
Sessions = o.Sum(t => t.sessions),
NewUsers = o.Sum(t => t.new_users),
PageViews = o.Sum(t => t.page_views),
Bounces = o.Sum(t => t.bounces),
Duration = o.Sum(t => t.duration),
Hits = o.Sum(t => t.hits)
})
.OrderByDescending(o => o.Sessions)
.Take(10)
.ToList()
.Select(o => new Itc.MetricPortal.WebStats.Metric.ViewModels.SummaryViewModel() {
KeyName = o.Source,
Sessions = o.Sessions,
NewUsers = o.NewUsers,
PageViews = o.PageViews,
Bounces = o.Bounces,
Duration = o.Duration,
Hits = o.Hits
});
-------------------------
***************
SQL OUTPUT
***************
SELECT
`Project1`.`C7` AS `C1`,
`Project1`.`source`,
`Project1`.`C1` AS `C2`,
`Project1`.`C2` AS `C3`,
`Project1`.`C3` AS `C4`,
`Project1`.`C4` AS `C5`,
`Project1`.`C5` AS `C6`,
`Project1`.`C6` AS `C7`
FROM (SELECT
`GroupBy1`.`A1` AS `C1`,
`GroupBy1`.`A2` AS `C2`,
`GroupBy1`.`A3` AS `C3`,
`GroupBy1`.`A4` AS `C4`,
`GroupBy1`.`A5` AS `C5`,
`GroupBy1`.`A6` AS `C6`,
`GroupBy1`.`K1` AS `source`,
1 AS `C7`
FROM (SELECT
`Extent3`.`source` AS `K1`,
SUM(`Extent1`.`sessions`) AS `A1`,
SUM(`Extent1`.`new_users`) AS `A2`,
SUM(`Extent1`.`page_views`) AS `A3`,
SUM(`Extent1`.`bounces`) AS `A4`,
SUM(`Extent1`.`duration`) AS `A5`,
SUM(`Extent1`.`hits`) AS `A6`
FROM `fact_web_session_summary` AS `Extent1`
INNER JOIN `dim_date` AS `Extent2` ON `Extent1`.`date_id` = `Extent2`.`date_id`
INNER JOIN `dim_web_source` AS `Extent3` ON `Extent1`.`web_source_id` = `Extent3`.`id`
WHERE (`Extent2`.`date` >= '2015-01-01') AND (`Extent2`.`date` <= '2015-10-01')
GROUP BY
`Extent3`.`source`) AS `GroupBy1`) AS `Project1`
ORDER BY
`Project1`.`C1` DESC LIMIT 10
Description: When performing a Where -> GroupBy -> OrderBy, -> Take() -> ToList(), the OrderBy column is transposed in the final derived table in SQL. Notice column C1 How to repeat: *************** SQL TABLES *************** CREATE TABLE `fact_web_session_summary` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `date_id` INT(11) NOT NULL, `web_profile_id` INT(11) NOT NULL, `web_visitor_location_id` INT(11) NOT NULL, `web_platform_device_id` INT(11) NOT NULL, `web_source_id` INT(11) NOT NULL, `web_session_flags_id` INT(11) NOT NULL, `page_views` INT(11) NOT NULL, `hits` INT(11) NOT NULL, `users` INT(11) NOT NULL, `new_users` INT(11) NOT NULL, `sessions` INT(11) NOT NULL, `bounces` INT(11) NOT NULL, `duration` INT(11) NOT NULL PRIMARY KEY (`id`) ) COLLATE='utf8_general_ci' ENGINE=InnoDB; CREATE TABLE `dim_web_source` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `source` VARCHAR(200) NOT NULL, `medium` VARCHAR(200) NOT NULL, PRIMARY KEY (`id`) ) COLLATE='utf8_general_ci' ENGINE=InnoDB ; --------------------------------- *************** MODELS FOR DB CONTEXT *************** using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Test { public class fact_web_session_summary { public int id { get; set; } public int duration { get; set; } public int bounces { get; set; } public int sessions { get; set; } public int new_users { get; set; } public int users { get; set; } public int page_views { get; set; } public int hits { get; set; } public int web_source_id { get; set; } public virtual dim_web_source web_source { get; set; } public int date_id { get; set; } public virtual dim_date date { get; set; } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Test { public class dim_web_source { public int id { get; set; } public string source { get; set; } public string medium { get; set; } public virtual ICollection<fact_web_session_summary> web_session_summaries { get; set; } } } -------------------------------- *************** LINQ STATEMENT *************** var startDate = Convert.ToDateTime("01/01/2015"); var endDate = Convert.ToDateTime("10/01/2015"); dbContext.fact_web_session_summary .Where(o => o.dim_date.date >= startDate && o.dim_date <= endDate) .GroupBy(o => o.web_source.source) .Select(o => new { Source = o.Key, Sessions = o.Sum(t => t.sessions), NewUsers = o.Sum(t => t.new_users), PageViews = o.Sum(t => t.page_views), Bounces = o.Sum(t => t.bounces), Duration = o.Sum(t => t.duration), Hits = o.Sum(t => t.hits) }) .OrderByDescending(o => o.Sessions) .Take(10) .ToList() .Select(o => new Itc.MetricPortal.WebStats.Metric.ViewModels.SummaryViewModel() { KeyName = o.Source, Sessions = o.Sessions, NewUsers = o.NewUsers, PageViews = o.PageViews, Bounces = o.Bounces, Duration = o.Duration, Hits = o.Hits }); ------------------------- *************** SQL OUTPUT *************** SELECT `Project1`.`C7` AS `C1`, `Project1`.`source`, `Project1`.`C1` AS `C2`, `Project1`.`C2` AS `C3`, `Project1`.`C3` AS `C4`, `Project1`.`C4` AS `C5`, `Project1`.`C5` AS `C6`, `Project1`.`C6` AS `C7` FROM (SELECT `GroupBy1`.`A1` AS `C1`, `GroupBy1`.`A2` AS `C2`, `GroupBy1`.`A3` AS `C3`, `GroupBy1`.`A4` AS `C4`, `GroupBy1`.`A5` AS `C5`, `GroupBy1`.`A6` AS `C6`, `GroupBy1`.`K1` AS `source`, 1 AS `C7` FROM (SELECT `Extent3`.`source` AS `K1`, SUM(`Extent1`.`sessions`) AS `A1`, SUM(`Extent1`.`new_users`) AS `A2`, SUM(`Extent1`.`page_views`) AS `A3`, SUM(`Extent1`.`bounces`) AS `A4`, SUM(`Extent1`.`duration`) AS `A5`, SUM(`Extent1`.`hits`) AS `A6` FROM `fact_web_session_summary` AS `Extent1` INNER JOIN `dim_date` AS `Extent2` ON `Extent1`.`date_id` = `Extent2`.`date_id` INNER JOIN `dim_web_source` AS `Extent3` ON `Extent1`.`web_source_id` = `Extent3`.`id` WHERE (`Extent2`.`date` >= '2015-01-01') AND (`Extent2`.`date` <= '2015-10-01') GROUP BY `Extent3`.`source`) AS `GroupBy1`) AS `Project1` ORDER BY `Project1`.`C1` DESC LIMIT 10