在MySQL 8上使用CTE更新linq2db

这个问题是关于linq2db.MySql 3.1.5和MySQL 8.0.21

按如下所示,尝试在MySql上使用CTE运行更新(标记重复的电子邮件)时,出现“您的SQL语法有错误...”

                var cte = (
                        from x in db.GetTable<PEmailCleanupJobItem>()
                        group x by x.Emailaddress into eGroup
                        where eGroup.Count() > 1
                        select new { Emailaddress = eGroup.Key }
                ).AsCte();

                var qry = (
                    from e in db.GetTable<PEmailCleanupJobItem>()
                    from d in cte
                        .InnerJoin(d => e.Emailaddress == d.Emailaddress)
                    select e
                );

                await qry
                    .Set(e => e.IsDuplicate,true)
                    .UpdateAsync();

这将生成以下内容并将其发送到MySQL

--  MySql.Official MySql (asynchronously)
DeclARE @IsDuplicate UByte -- Boolean
SET     @IsDuplicate = 1

UPDATE `CTE_1` (`Emailaddress`)
AS
(
        SELECT
                `t1`.`email_address`
        FROM
                `emails` `t1`
        GROUP BY
                `t1`.`email_address`
        HAVING
                Count(*) > 1
)
FROM
        `emails` `d`
                INNER JOIN `CTE_1` `e` ON (`d`.`email_address` IS NULL AND `e`.`Emailaddress` IS NULL OR `d`.`email_address` = `e`.`Emailaddress`)
SET
        `d`.`is_duplicate` = @IsDuplicate

注意如何生成UPDATE `CTE_1` (`Emailaddress`)而不是WITH `CTE_1` (`Emailaddress`)

我将手动编写此查询(有效)为

WITH `CTE_1` (`Emailaddress`)
AS
(
        SELECT
                `t1`.`email_address`
        FROM
                `emails` `t1`
        GROUP BY
                `t1`.`email_address`
        HAVING
                Count(*) > 1
)
UPDATE 
    `emails` `d`
            INNER JOIN `CTE_1` `e` ON (`d`.`email_address` IS NULL AND `e`.`Emailaddress` IS NULL OR `d`.`email_address` = `e`.`Emailaddress`)
SET
    `d`.`is_duplicate` = 1

这是linq2db的错误,还是我缺少什么?

a546335402 回答:在MySQL 8上使用CTE更新linq2db

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/1352327.html

大家都在问