QueryOver Ou avec sous-Requête
IHave la suite de NHibernate requête en utilisant une sous-requête:
NHContext.Session.QueryOver<Item>()
.WithSubquery.WhereProperty(x => x.ItemId).In(QueryOver.Of<Foo>().Where(x => x.AFlag).Select(x => x.ItemId))
.WithSubquery.WhereProperty(x => x.ItemId).In(QueryOver.Of<Bar>().Where(x => x.AFlag).Select(x => x.Item))
.Future<Item>();
Cela exécute la requête SQL suivante:
SELECT *
FROM item this_
WHERE this_.ItemId in (SELECT this_0_.ItemId as y0_
FROM Foo this_0_
WHERE this_0_.AFlag = 1 /* @p0 */)
and this_.ItemId in (SELECT this_0_.ItemId as y0_
FROM Bar this_0_
WHERE this_0_.AFlag = 1 /* @p0 */)
Je tiens à utiliser OU ainsi, par exemple:
SELECT *
FROM item this_
WHERE this_.ItemId in (SELECT this_0_.ItemId as y0_
FROM Foo this_0_
WHERE this_0_.AFlag = 1 /* @p0 */)
or this_.ItemId in (SELECT this_0_.ItemId as y0_
FROM Bar this_0_
WHERE this_0_.AFlag = 1 /* @p0 */)
Je sais que je peux le faire dans les Critères en faisant quelque chose comme:
var disjunction = new Disjunction();
disjunction.Add(Subqueries.PropertyIn("ItemId",
DetachedCriteria.For<Foo>()
.SetProjection(Projections.Property("ItemId"))
.Add(Restrictions.Eq("AFlag", 1))
));
Mais je me demandais si il y avait un moyen plus facile de le faire via QueryOver, et en évitant d'utiliser des chaînes de caractères pour les noms de propriété.
Merci pour toute aide.
Vous devez vous connecter pour publier un commentaire.
Pour la commune de moins de disjonction(ou) je pense que vous devez utiliser le
Subqueries.WhereProperty<>
au lieu deWithSubquery