Имейте в виду, что независимо от сценария причина всегда одинакова в .NET:
Вы пытаетесь использовать ссылочную переменную, значение которой
Nothing
/null
. Если для ссылочной переменной значениеNothing
/null
, это означает, что на самом деле оно не содержит ссылку на экземпляр любого объекта, который существует в куче.Вы либо никогда не присваивали какую-либо переменную, никогда не создавали экземпляр значения, присвоенного переменной, или вы вручную устанавливали переменную, равную
blockquote>Nothing
/null
, или вы вызывали функцию, которая установите для этой переменной значениеNothing
/null
.
Хорошо, после многих исследований я понял, что это мое собственное незнание терминологии SQL, которая удерживала меня. Мой поиск решения для поиска пользователей, принадлежащих к «хотя бы одному из» списка групп, должен был найти пользователей, принадлежащих к «любому» из списка групп. Функция any
ORM от SQLAlchemy делает именно то, что мне нужно, например:
session.query(ZKUser).filter(ZKUser.groups.any(ZKGroup.id.in_([1,2,3])))
Этот код испускает этот SQL (в MySQL 5.1):
SELECT * FROM users
WHERE EXISTS (
SELECT 1 FROM user_groups, groups
WHERE users.id = user_groups.contact_id
AND groups.id = user_groups.group_id
AND groups.id IN (%s, %s, %s)
)
В соответствии с документами для any
запрос будет работать быстрее, если вместо этого использовать явный join
:
. Поскольку any () использует коррелированный подзапрос, его производительность не так хороша при сравнении с большими целевыми таблицами, как с использованием соединения.
blockquote>В вашем случае вы можете сделать что-то вроде:
users = ( session.query(ZKUser) .join(user_groups) .filter(user_groups.columns.group_id.in_([1, 2, 3])) )
Это испускает SQL:
SELECT * FROM users JOIN user_groups ON users.id = user_groups.user_id WHERE user_groups.group_id IN (1, 2, 3)
Вы можете использовать in_
:
session.query(ZKUser).filter(ZKGroup.id.in_([1,2])).all()