【问题标题】:trying to pass list of guids to table试图将 guid 列表传递给表
【发布时间】:2021-07-06 05:45:23
【问题描述】:

我有一个表,其中列(SelectedIds)数据类型之一是uuid 数组,我正在使用 RAW sql 插入语句传递相同的 guid,如下所示

foreach(var designHubProjectSpaceType in designHubProjectSpaceTypes)
{
    var warningJson = JsonConvert.SerializeObject(designHubProjectSpaceType.Warnings).Replace("'", "''", StringComparison.Ordinal);
    var initialObjectJson  = JsonConvert.SerializeObject(designHubProjectSpaceType.InitialObject).Replace("'", "''", StringComparison.Ordinal);
    var patchJson = JsonConvert.SerializeObject(designHubProjectSpaceType.Patches).Replace("'", "''", StringComparison.Ordinal);

    migrationBuilder.Sql($@"INSERT INTO ""DesignHubProjectSpaceTypes""(""Id"", ""ProjectNumber"", ""ExcludedIds"", ""SelectedIds"", ""IsBasedOnMaster"", ""Warnings"", ""InitialObject"", ""Patches"") "
                       + $@"VALUES ('{designHubProjectSpaceType.Id}', '{designHubProjectSpaceType.ProjectNumber}', [], '{designHubProjectSpaceType.SelectedIds.Select(a => a).ToList()}', '{designHubProjectSpaceType.IsBasedOnMaster}', 
                         '{warningJson}', '{initialObjectJson}', '{patchJson}' )");
} 

这里designHubProjectSpaceType.SelectedIds.Select(a => a).ToList() 有guid 的列表,这就是我试图传递到SelectedIds 列的内容。但是当我试图查看传递的 sql 字符串时,我注意到代替那些 guid system.Collections.Generic.List[System.Guid] 被传递,如下图所示

这些是 designHubProjectSpaceType.SelectedIds 持有的 guid,我不知道我在哪里做错了。

任何人都可以让我知道为什么 guid 列表作为类型传递,我使用 postgreSQL 作为 DB 并使用 EFCore。我已经把上面的代码放到迁移文件里了。

下面是表结构

遇到此'{string.Join(',', selectedIds)}' 的错误

【问题讨论】:

  • 嘿 - 你到底遇到了什么异常?
  • 你可以插入数组的数据库是什么?
  • @PiotrŻak 得到像 syntax error at or near "[" 这样的异常,而不是 guid 列表 system.Collections.Generic.List[System.Guid]
  • @spzvtbg 数据库是 postgresql 并且列数据类型 id uuid[] 我更新了相同的问题
  • designHubProjectSpaceType.SelectedIds.Select(a => a).ToList().ToString() = System.Collections.Generic.List`1[...] 而不是 [ {xxx-xxx- xx-xx},{...},...]

标签: c# .net postgresql entity-framework-core npgsql


【解决方案1】:

代码的问题在于,它通过字符串插值隐式调用 ToString(),将列表转换为字符串。查看此示例:

Guid[] selectedIds = new Guid[]{
    Guid.NewGuid(),
    Guid.NewGuid()
};

string error = $@"'{selectedIds.Select(a => a).ToList()}'";
Console.WriteLine($"Error: {error}");

// Tweak the following string interpolations according to the target SQL syntax you needed.

// Join string with single quotes
string correct = $@"'{{{string.Join(',', selectedIds)}}}'";
Console.WriteLine($"Format 1: {correct}");

// Putting `{}` over uuid, and adding the list into a `[]`:
string correct2 = $@"'[{string.Join(',', selectedIds.Select(id => "{" + id + "}"))}]'";
Console.WriteLine($"Format 2: {correct2}");

输出:

Error: 'System.Collections.Generic.List`1[System.Guid]'
Format 1: '{5e4b44c2-f087-44db-98b0-95da1ae20ed7,1153d836-baee-4ba4-85f1-6f0c08934135}'
Format 2: '[{5e4b44c2-f087-44db-98b0-95da1ae20ed7},{1153d836-baee-4ba4-85f1-6f0c08934135}]'

另一方面,如果您将发送到控制台的 sql 输出到控制台或记录以进行调试,可能会更容易。

【讨论】:

  • 我提到了 sql 输出实际上将发送到有问题的数据库,我会试试你的
  • @EnigmaState :-) 我没有抱怨您问题中的信息。很好,那里有很多细节。我假设您运行查询以获取错误,我只是建议在本地输出字符串以与所需的字符串形式的 SQL 进行比较。
  • 它实际上正在寻找的输出像这样{list of guids separated by commas},但看起来像你的输出,我们只是通过ids separated by commas
  • 好的。谢谢(你的)信息。试试这个:string correct = $@"'{{{string.Join(',', selectedIds)}}}'";
  • 您能否解释一下您对 uuid 数组的预期 sql 字符串是什么样的?它是像'guid1, guid2'[{guid1}, {guid2}] 这样的单引号列表吗?这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多