OrmLite Contains()无法按预期工作

时间:2019-05-11 22:13:43

标签: servicestack

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

ui.router

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

如果我尝试使用查询生成器来做到这一点,那么

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

然后它抛出异常,因为它认为“博客”是一列并将其翻译成 var q = _db.From<UserAuthCustom>() .Where(x => x.Roles.Contains("Bloggers")) .Limit(1); 之类的东西。

是否可以在blobled字段上执行类似WHERE bloggers IN (null)的操作?

1 个答案:

答案 0 :(得分:1)

您不能对诸如Roles集合之类的blobed列使用类型化查询,这些列在表中使用configured complex type serializer进行blob,对于所有RDBMS而言默认为JSV format,但使用PostgreSQL的PostgreSQL除外JSON。

如果您要在Roles集合上执行服务器端查询,建议使用persisting them in distinct tables

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

这样,您可以使用标准的联接查询来选择具有特定角色的所有用户:

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%" });