c# - 使用 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 ,但这没有任何区别。
解决方案
目前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
推荐阅读
- decision-model-notation - 如何验证 DMN camunda 中的多个规则输入
- oracle - oracle select sequence.nextval from dual 听起来太慢了
- mysql - 日期间隔 mysql 今天没有显示
- python - 如何清理熊猫数据框
- python - 如何在python中按字符串的顺序有效地识别子字符串
- android - 如何从父活动的片段访问视图?
- android - 在华为设备上设置默认 Android 启动器?
- google-maps - 谷歌地图:我如何才能获得谷歌评论的确切日期?
- c++ - 第一个函数中的无限循环不知道如何修复
- python - LogitBoost 要求基估计量是回归量