OrmLite Contains () не работает должным образом - PullRequest
2 голосов
/ 12 мая 2019

Если я попытаюсь получить всех пользователей с определенной ролью, подобной этой:

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

Тогда все работает как положено и возвращается пользователям.

Если я попытаюсь сделать это с помощью построителя запросов, вот так:

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

Затем он генерирует исключение, потому что считает, что "блоггеры" - это столбцы, и перевел это в нечто вроде WHERE bloggers IN (null).

Можно ли сделать что-то вроде LIKE '%\"Blogger\"%' в поле большого двоичного объекта?

1 Ответ

1 голос
/ 12 мая 2019

Нельзя использовать типизированные запросы к столбцам больших двоичных объектов, таким как коллекция Roles, которые создаются в таблице с BLOB-объектами, используя настроенный сериализатор комплексного типа 1003 *, который по умолчанию равен формат JSV для всехСУБД, за исключением PostgreSQL, который использует JSON.

Если вы хотите выполнять серверные запросы к коллекции ролей, я бы порекомендовал сохранить их в отдельных таблицах :

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:

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