OrmLite Contains() 没有按预期工作

OrmLite Contains() not working as expected

如果我尝试让所有用户都具有这样的特定角色:

 _db.Select<UserAuthCustom>(x => x.Roles.Contains("Bloggers"));

然后它按预期工作并返回用户。

如果我尝试像这样使用查询构建器:

        var q = _db.From<UserAuthCustom>()
            .Where(x => x.Roles.Contains("Bloggers"))
            .Limit(1);

然后它抛出一个异常,因为它认为 "bloggers" 是一个列,并将其转换为类似 WHERE bloggers IN (null).

的内容

是否可以在斑点字段上执行类似 LIKE '%\"Blogger\"%' 的操作?

您不能对像 Roles 集合这样的斑点列使用类型化查询,这些列在 table 中使用 configured complex type serializer which defaults to JSV format 对除 Postgre[=31= 之外的所有 RDBMS 进行斑点化] 使用 JSON.

如果您想对 Roles 集合执行 server-side 查询,我建议 persisting them in distinct tables:

container.Register<IAuthRepository>(c =>
    new OrmLiteAuthRepository<UserAuthCustom, UserAuthDetails>(c.Resolve<IDbConnectionFactory>()) {
        UseDistinctRoleTables = true
    });

这样您就可以使用标准加入查询 select 特定角色的所有用户:

var q = db.From<UserAuthCustom>()
      .Join<UserAuthRole>((u,r) => r.UserAuthId = u.Id)
      .Where<UserAuthRole>(x => x.Role == "Bloggers");

或者,您需要创建一个自定义 SQL 查询,以将斑点角色列作为字符串进行查询,例如:

q.Where("Roles LIKE @role", new { role = "%Blogger%" });

或在自定义 SQL 表达式中使用 typed column names

q.Where(q.Column<UserAuthCustom>(x => x.Roles) + " LIKE @role, 
    new { role = "%Blogger%" });