C# Linq群优化
我有一个mysql表,其中包含大量数据,如下所示:C# Linq群优化,c#,mysql,performance,entity-framework,linq,C#,Mysql,Performance,Entity Framework,Linq,我有一个mysql表,其中包含大量数据,如下所示: fk_string CHAR(6) NOT NULL timestamp BIGINT(20) NOT NULL 注意:定义了一个包含这两个字段的主键,表中还有其他字段,本例中将不使用这些字段 我想为每个fk_字符串获取总条目计数以及最小和最大时间戳。因此,我编写了以下Linq查询: var resQuery = db.Ticks.GroupBy(t => t.FkString) .Select(t => new {
fk_string CHAR(6) NOT NULL
timestamp BIGINT(20) NOT NULL
注意:定义了一个包含这两个字段的主键,表中还有其他字段,本例中将不使用这些字段
我想为每个fk_字符串获取总条目计数以及最小和最大时间戳。因此,我编写了以下Linq查询:
var resQuery = db.Ticks.GroupBy(t => t.FkString)
.Select(t => new {
Key = t.Key
, Total = t.LongCount()
, First = t.Min(x => x.Timestamp)
, Last = t.Max(x => x.Timestamp)
});
Linq生成的查询如下:
SELECT
1 AS `C1`,
`GroupBy1`.`K1` AS `fk_string`,
`GroupBy1`.`A1` AS `C2`,
`GroupBy1`.`A2` AS `C3`,
`GroupBy1`.`A3` AS `C4`
FROM (SELECT
`Project1`.`fk_string` AS `K1`,
COUNT(1) AS `A1`,
MIN(`Project1`.`C1`) AS `A2`,
MAX(`Project1`.`C1`) AS `A3`
FROM (SELECT
`Extent1`.`fk_string`,
`Extent1`.`timestamp` AS `C1`
FROM `data` AS `Extent1`) AS `Project1`
GROUP BY `Project1`.`fk_string`) AS `GroupBy1`
问题是,因为我正在重用timestamp列,Linq添加了另一个子选择,而不是直接从表中选择。我期待的问题是:
SELECT
1 AS `C1`,
`GroupBy1`.`K1` AS `fk_string`,
`GroupBy1`.`A1` AS `C2`,
`GroupBy1`.`A2` AS `C3`,
`GroupBy1`.`A3` AS `C4`
FROM (SELECT
`Project1`.`fk_string` AS `K1`,
COUNT(1) AS `A1`,
MIN(`Project1`.`C1`) AS `A2`,
MAX(`Project1`.`C1`) AS `A3`
FROM `data` AS `Project1`
GROUP BY `Project1`.`fk_string`) AS `GroupBy1`
相反,Linq生成的一个需要3倍的时间。
有没有办法禁用或控制这种行为?也许可以将
GroupBy
移动到Select
?如果蜱虫叮咬的话,要除掉它吗
您能否让LINQ简单地执行以下操作:
SELECT fk_string AS FkString,
COUNT(*) AS Total,
MIN(timestamp) AS First,
MAX(timestamp) AS Last,
GROUP BY fk_string;
(不用站在头上用额外的按键和函数调用键入相同的内容?)
此外,对于性能:
INDEX(fk_string, timestamp)
也许将
GroupBy
移动到Select
?如果蜱虫叮咬的话,要除掉它吗
您能否让LINQ简单地执行以下操作:
SELECT fk_string AS FkString,
COUNT(*) AS Total,
MIN(timestamp) AS First,
MAX(timestamp) AS Last,
GROUP BY fk_string;
(不用站在头上用额外的按键和函数调用键入相同的内容?)
此外,对于性能:
INDEX(fk_string, timestamp)
您使用的是哪种LINQ提供程序?LINQ to SQL似乎没有生成如此复杂的查询。@NetMage标记表示实体框架。真恶心。即使是第二个
SELECT
也显得不必要的复杂(而且速度慢)。是时候抛弃林克了?林克很好。是实体框架产生了低效的混乱。您使用的是哪种LINQ提供程序?LINQ to SQL似乎没有生成如此复杂的查询。@NetMage标记表示实体框架。真恶心。即使是第二个SELECT
也显得不必要的复杂(而且速度慢)。是时候抛弃林克了?林克很好。是实体框架产生了低效的混乱。是的,这正是我想要做的。问题是怎么做?是的,这正是我想做的。问题是怎么做?