如果我尝试让所有具有特定角色的用户像这样:
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)
的操作?
答案 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%" });