c# - Dapper 使用 where 子句插入外键 ID
问题描述
我有几个模型:User 和 ShiftWork:
public class User
{
public long Id { get; set; }
public string Username { get; set; }
public string SSO { get; set; }
public ShiftWork ShiftWork { get; set; }
}
public class ShiftWork
{
public long Id { get; set; }
public string ShiftName { get; set; }
}
我也有选择和插入数据的类。到目前为止,我已经能够为我想做的所有事情找到解决方案,但我似乎无法插入我想要做的用户。
我希望能够插入ShiftWorkId
到 User 表中,但我需要从ShiftName
Winform 文本框中的 Id 中获取。
到目前为止,我的努力基本上是这样的:
public void CreateUser(User user)
{
using (IDbConnection cnn = SimpleDBConnection())
{
string sql = "INSERT INTO USER (Username, SSO, ShiftWorkId) Values (@Username, @SSO, (select @Id from ShiftWork Where ShiftName in (select ShiftName from ShiftWork)))";
cnn.Execute(sql, new { user.Username, user.SSO, user.ShiftWork.Id });
}
}
我也试过:
string sql = "INSERT INTO USER (Username, SSO, ShiftWorkId) Values (@Username, @SSO, (select @Id from ShiftWork Where ShiftName = @ShiftName))";
但是,我似乎不知道应该如何为 ShiftName 添加参数。
文本框有一个从数据库填充的自定义自动完成源:
public List<ShiftWork> GetShifts()
{
using (IDbConnection cnn = SimpleDBConnection())
{
string sql = "SELECT * FROM ShiftWork";
var output = cnn.Query<ShiftWork>(sql);
return output.ToList();
}
}
在后面的代码中看起来像:
AutoCompleteStringCollection ac = new AutoCompleteStringCollection();
foreach (var s in _shiftWorkRepository.GetShifts())
{
ac.Add(s.ShiftName);
}
tbShift.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
tbShift.AutoCompleteSource = AutoCompleteSource.CustomSource;
tbShift.AutoCompleteCustomSource = ac;
到目前为止,我所尝试的关于将文本从文本框中的文本分配给 user.shiftworkId 的一切都给了我错误。非常感谢所有帮助
解决方案
发生这种情况的原因实际上有很多:
1)在提出的两个查询中,在 ID 之前都使用了“@”字符。@ 字符仅在您向查询提供变量并且在无法解析变量的情况下使用。
2) SQL 语句的正确性。
3) USER - 是一个 SQL 关键字,要使其作为表名工作,应使用方括号。
4)在调用 Execute - Shift Id 被传递给查询。应传递 ShiftName 以使其工作。
这是在这种情况下用于传递有效参数的选项:
cnn.Execute(sql, new {
Username = "here goes your username",
SSO = "here goes SSO",
ShiftName = "shift name"
});
下面的查询(假设您使用的是 SQL Server):
INSERT INTO [USER] (Username, SSO, ShiftWorkId)
SELECT @Username, @SSO, Id
FROM ShiftWork
WHERE ShiftName = @ShiftName
注意: 通常使用 Dapper ORM 编写复杂的 SQL 不是一个好习惯。
使 Dapper 查询中的 SQL 干净整洁通常会带来更好的可维护性。
推荐阅读
- java - 从处理表单提交指南(Spring 入门指南)中获取代码错误
- javascript - foreach中的条件语句?
- sql - SQL Server 对 JSON 的支持是否可以替代 MongoDB 等 NoSql 解决方案?
- javascript - 如何将单击的按钮的文本内容保存到变量中
- wpf - WPF:在我的组合框工具提示上显示我的所有对象属性
- sql - 选择常用值并添加它们 SQL
- python - PysimpleGUI - 简单的动画
- javascript - 异步数组缓冲区中的“未定义 Blob”错误。如何解决?
- python - 如何解决从错误的 json 格式解码的问题
- google-cloud-dataflow - Apache Beam/Dataflow:每次部署初始化状态的最佳方式