首页 > 解决方案 > 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 表中,但我需要从ShiftNameWinform 文本框中的 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 的一切都给了我错误。非常感谢所有帮助

标签: c#winformssqlitedapper

解决方案


发生这种情况的原因实际上有很多:

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 干净整洁通常会带来更好的可维护性。


推荐阅读