Il semble que vous puissiez utiliser des filtres pour cela.
D'abord, vous devez définir les types de filtres
public class SpecificCategoryFilter : FilterDefinition
{
public SpecificCategoryFilter()
{
WithName("SpecificCategory").WithCondition("Category = 'A constant expression'");
}
}
public class SpecificLanguageFilter : FilterDefinition
{
public SpecificLanguageFilter()
{
WithName("SpecificLanguage").WithCondition("Language = 'A constant expression'");
}
}
ÉDITÉE: Selon les commentaires, il n'y a pas .ApplyFilter<TFilter>()
sur References()
, ont donc mis à jour avec ce que je crois est la façon de le faire avec des filtres
les filtres doivent être appliqués dans les applications couramment
public class Table2Map : ClassMap<Table2>
{
public Table2Map()
{
// Other mappings here...
ApplyFilter<SpecificCategoryFilter>();
ApplyFilter<SpecificLanguageFilter>();
}
}
Enfin, lorsque vous ouvrez une session, vous devez activer les filtres
using (var session = sessionFactory.OpenSession())
{
session.EnableFilter("SpecificCategory");
session.EnableFilter("SpecificLanguage");
}
Si vous utilisez une implémentation de ICurrentSessionContext
et les filtres doivent toujours appliquer alors vous pouvez activer les filtres de la session de retour de l'appel à ICurrentSessionContext.CurrentSession()
.
Maintenant, lors de l'interrogation Table1
, afin de les filtres activer pour Table2
, vous devez indiquer NHibernate à se joindre à la Table2
référencé; vous pouvez le faire en utilisant
Fetch(t => t.Table2).Eager
JoinQueryOver(t => t.Table2)
(et similaires stratégies de jointure)
Sans indiquer à NHibernate pour faire la jointure, la référence sera paresseusement-chargé par défaut et donc les filtres ne sera pas appliqué dans la requête. L'inconvénient est que Table2
sera recherché, mais je ne connais pas de moyen d'avoir les filtres appliqués autrement. La requête suivante
session.QueryOver<Table1>().Inner.JoinQueryOver(t => t.Table2).List();
résultats dans SQL similaire à
SELECT
this_.Id as Id0_1_,
this_.Table2Id as Table3_0_1_,
table2_.Id as Id1_0_,
table2_.Category as Category1_0_,
table2_.Language as Language1_0_
FROM
Table1 this_
inner join
Table2 table2_
on this_.Table2Id=table2_.Id
WHERE
table2_.Category = 'A constant expression'
and table2_.Language = 'A constant expression'
qui est semblable à SQL que vous avez dans votre question.
Le problème est que je ne peux pas se permettre d'avoir des sous-requêtes, et la formule ne permet pas de faire référence à l'entité jointe . –
Pourquoi ne pas utiliser HQL ou ICriteria? – sl3dg3