在 C# 中使用 EF Core 和 PostgreSQL 查询 JSONB 数组

Dis*_*ame 1 c# postgresql entity-framework-core

我有一个复杂的数组,需要在 EF Core 中查询,但似乎找不到正确的组合:

 public class A
 {
     public string Name { get; set; }

     [Column(TypeName = "jsonb")] 
     public List<B> Tags { get; set; }
 }

 public class B
 {
     public Guid Id { get; set; }
     public string Name { get; set; }
 }
Run Code Online (Sandbox Code Playgroud)

使用这些模型类,我试图找到 B 等于某个值的每个 A 和/或列表中的 B。对于第一种情况,我尝试了以下方法但没有成功:

 var query = "{\"Id\": \"7aecbd2c-ae2e-4362-9bd6-1d569eb94849\"}";

 var test1 = await context.A
                          .Where(a => EF.Functions.JsonExistAny(a.B, query))
                          .ToListAsync(context.CancellationToken);

 var test2 = await context.A
                          .Where(a => EF.Functions.JsonContains(a.B, query))
                          .ToListAsync(context.CancellationToken);

 var test3 = await context.A
                          .Where(a => EF.Functions.JsonContained(query, a.B))
                          .ToListAsync(context.CancellationToken);

 var test4 = await context.A
                          .Where(a => a.B.Any(b => b.Id == Guid.Parse("7aecbd2c-ae2e-4362-9bd6-1d569eb94849")))
                          .ToListAsync(context.CancellationToken);
Run Code Online (Sandbox Code Playgroud)

任何方向将不胜感激

Oka*_*dag 5

您应该使用方括号[]进行 jsonb 数组查询。

解决方案:

var query = "[{\"Id\": \"7aecbd2c-ae2e-4362-9bd6-1d569eb94849\"}]";

var test2 = await context.A
                          .Where(a => EF.Functions.JsonContains(a.B, query))
                          .ToListAsync(context.CancellationToken);
Run Code Online (Sandbox Code Playgroud)

jsonb 数组的查询示例:

SELECT u."Id", u."Addresses"
FROM "Users" AS u
WHERE u."Addresses" @> '[{"Code": 10}]'
Run Code Online (Sandbox Code Playgroud)