Je suis relativement nouveau dans l'utilisation de base de NHibernate. Je me demande si quelqu'un peut me aider à formuler le code pour le scénario suivant:Plusieurs requêtes de jointure et tables de pontage avec NHibernate
Structure de la table
UserProfile
UserProfile_SubTableA_Bridge
SubTableA
UserProfile_SubTableB_Bridge
SubTableB
Je suis en train de construire une requête qui accomplit ceci:
FetchAllNotDeleted(IEnumerable<SubTableB> SelectedA, IEnumerable<SubTableB> SelectedB)
{
select * from UserProfile
left join SubTable1_Bridge A
left join SubTable2_Bridge B
where
A.Id in(SelectedA)
OR B.Id in (SelectedB)
return Query().Future();
}
Cela semble assez simple sql régulière, mais Je ne sais pas comment formuler cette requête en utilisant NHib. Que dois-je faire si je souhaite ajouter les jointures de manière conditionnelle selon que SelectedA ou SelectedB est nul? Quelque chose comme:
if(selectedA != null) { /* add join and restrictions for A */}
if(selectedB != null) { /* add join and restrictions for B */}
J'ai essayé ce qui suit, il est proche, mais il "et" les ensemble au lieu de "ou"
if (selectedA != null)
{
var selectedIds = selectedA.Select(x => x.Id.ToString()).ToList();
query.JoinQueryOver(x => x.SubA, JoinType.LeftOuterJoin).And(
Restrictions.Disjunction().Add(
Restrictions.In("Id", selectedIds)
)
);
}
if (selectedB != null)
{
var selectedIds = selectedB.Select(x => x.Id.ToString()).ToList();
query.JoinQueryOver(x => x.SubB, JoinType.LeftOuterJoin).And(
Restrictions.Disjunction().Add(
Restrictions.In("Id", selectedIds)
)
);
}
Je pense que la partie sur laquelle je suis accroché est la partie «OU» de la clause where. Je peux écrire chaque requête séparément, mais je n'arrive pas à les faire faire «l'un ou l'autre» – tjans
Quelle version de NHibernate utilisez-vous? – MonkeyCoder
J'utilise 3.2.0.2001 – tjans