首页 > 解决方案 > 使用 flatten groupjoin (lambda) 的结果时更新失败

问题描述

我正在尝试更新整个表以修改某些列并在其中存储另一个表的 Id。

以下代码在更新语句中失败,我不知道为什么。

db.gt_s_one
    .GroupJoin(db.access_mode,
        l => l.col3.Replace("auth.", "").ToUpper(),
        am => am.code.ToUpper(),
        (l, am) => new {
            l,
            am
        }
    )
    .SelectMany(
        x => x.am.DefaultIfEmpty(),
        (x1, y1) => new {
            gt = x1.l,
            theAM = y1.id
        }
    )
    .Update(db.GetTable<gt_s_one>(),
        s => new gt_s_one
        {
            col1 = s.gt.col1,
            col2 = s.gt.col2,
            col3 = s.gt.col3.Replace("auth.", ""),
            col4 = s.gt.col4,
            col5 = s.gt.col3 == "empty" ? "1" : "0",
            col6 = s.gt.col3 == "empty" ? "" : s.theAM.ToString()
        }
    );

我已经在 var 中隔离了第一部分(groupjoin 和 selectmany),并且执行它效果很好,但是当我执行更新部分时,我得到:

LinqToDB.SqlQuery.SqlException
  HResult=0x80131500
  Message=Table '[public].[access_mode]' not found.
  Source=linq2db

在我的 SelectMany 中,我尝试将 y1 作为一个整体来代替 y1.id ,但这没有任何区别。

标签: c#lambdaleft-joinflatlinq2db

解决方案


目前linq2db仅支持 SQL Server、Sybase 和 MySql 的查询。我看到您正在针对 PostgreSQL 运行它。对 PostgreSQL(和大多数其他数据库)的支持已经实现,并将作为linq2db版本 3 版本的一部分发布。为您的查询生成的 SQL 示例:

UPDATE
    gt_s_one
SET
    col1 = x.col1,
    col2 = x.col2,
    col3 = Replace(x.col3, 'auth.', ''),
    col4 = x.col4,
    col5 = CASE
        WHEN x.col3 = 'empty' THEN '1'
        ELSE '0'
    END,
    col6 = CASE
        WHEN x.col3 = 'empty' THEN ''
        ELSE Cast(am.id as VarChar(11))
    END
FROM
    gt_s_one x
        LEFT JOIN access_mode am ON Upper(Replace(x.col3, 'auth.', '')) = Upper(am.code)
WHERE
    gt_s_one.id = x.id

推荐阅读