J'ai les tables users
et users_updateable_data
qui ont une relation 1-to-1 (User.UpdateableData
). En outre, chaque User
peut être dans un Guild
(il y a une propriété Guild.Users
mappée; User.GuildId
est une clé étrangère pour guilds
). J'ai donc Guild, Guild.Users, User, User.UpdateableData, User.GuildId
.Rejoindre la propriété référencée sur l'élément de collection joint
J'essaie d'obtenir des propriétés spécifiques de users
qui répondent à certains critères:
donc je dois faire deux rejoint: guilde + utilisateurs (droit externe) et utilisateur + UPD. Les données.
Voilà comment j'essayé de le faire:
public virtual IEnumerable<UserTournamentInfo> GetTournamentUserToXP()
{
using (ISession session = SessionFactory.OpenSession())
using (session.BeginTransaction())
{
User userAlias = null;
User.UpdateableDataContainer userUpdAlias = null;
Guild guildAlias = null;
UserTournamentInfo dto2 = null;
var result = session.QueryOver<Guild>(() => guildAlias)
.JoinAlias(x => x.Users,() => userAlias, JoinType.RightOuterJoin)
// next line doesn't compile
.JoinAlias((User u) => u.UpdateableData,() => userUpdAlias, JoinType.RightOuterJoin)
.Select(MakeProjections())
.Where(() => userAlias.TournamentXP > 0)
.TransformUsing(Transformers.AliasToBean<UserTournamentInfo>())
.List<UserTournamentInfo>();
session.Transaction.Commit();
return result;
}
}
Voici comment je définis les projections:
public static IProjection[] MakeProjections()
{
Guild guildAlias = null;
User userAlias = null;
User.UpdateableDataContainer userUpdAlias = null;
UserTournamentInfo dto = null;
return new[]
{
Projections.Property(() => userAlias.Id).WithAlias(() => dto.Id),
Projections.Property(() => userUpdAlias.TournamentClassXP).WithAlias(() => dto.TournamentClassXP),
Projections.Property(() => userUpdAlias.TournamentXP).WithAlias(() => dto.TournamentXP),
Projections.Property(() => userAlias.GuildId).WithAlias(() => dto.GuildId),
Projections.Property(() => userAlias.League).WithAlias(() => dto.League),
Projections.Property(() => guildAlias.League).WithAlias(() => dto.GuildLeague),
};
}
Il a travaillé avant que je décide de diviser users
en deux tables - users
et users_updateable_data
.
Comment faire cette requête de jointure?