НГибернейт:Фильтрация запросов по списку значений с использованием критериев
-
20-08-2019 - |
Вопрос
Я пытаюсь фильтровать по списку значений, используя API критериев.Я подозреваю, что это невозможно, я просто спрашиваю здесь, чтобы убедиться.
class Entity
{
int id { get; set; }
IList<Guid> Guids { get; set; }
}
Отображение:
<class name="Entity">
<id ...></id>
<bag name="Guids" table="Entity_Guids">
<key column="Entity_FK"/>
<element column="Guid"/>
</bag>
</class>
Предполагается, что у меня есть список гидов (на самом деле это еще один подзапрос).Я хочу отфильтровать все объекты, в списке которых есть хотя бы один гид.
Sql будет выглядеть так:
SELECT *
FROM Entity e
inner join Entity_Guids eg
on e.id = eg.Entity_FK
WHERE
eg.Guid in (subquery)
С Criteria API это кажется невозможным.
ICriteria query = session
.CreateCriteria(typeof(Entity), "e")
.Add(Subqueries.In("e.Guids", subquery))
Выбрасывает исключение.
Решение
Ваш запрос не будет работать, поскольку свойство e.Guids, переданное в подзапрос, не является единственным значением.Чтобы сделать это таким образом, вы на самом деле пытаетесь выполнить пересечение и проверить, что это пересечение не пусто, чего, к сожалению, не существует в критериях API, хотя вы, вероятно, могли бы сделать это с помощью Linq.
Вероятно, вы все равно могли бы сделать это, если бы ваши Guid были сущностями с соответствующими свойствами (свойство Value содержит фактический Guid) и существовала двунаправленная связь:
var subquery2 = DetachedCriteria.For<GuidEntity>()
.Add(Subqueries.In("Value", subquery))
.SetProjection("Entity_FK");
ICriteria query = session.CreateCriteria(typeof (Entity))
.Add(Subqueries.In("Id", subquery2));