C# Linq群优化

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 {

我有一个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 {
        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
也显得不必要的复杂(而且速度慢)。是时候抛弃林克了?林克很好。是实体框架产生了低效的混乱。是的,这正是我想要做的。问题是怎么做?是的,这正是我想做的。问题是怎么做?