NHibernate在QueryOver中检查相同的联接

Cra*_*aig 5 nhibernate queryover

使用QueryOver我正在创建这样的查询

BulkActionItem bulkActionItemAlias1 = null;
BulkActionItem bulkActionItemAlias2 = null;

var query = GetSession().QueryOver<Student>(() => studentAlias)
        .JoinAlias(() => studentAlias.BulkNotifications, () => bulkActionItemAlias1, NHibernate.SqlCommand.JoinType.LeftOuterJoin);

if (query.UnderlyingCriteria.GetCriteriaByAlias("bulkActionItemAlias2") == null
    query = query.JoinAlias(() => studentAlias.BulkNotifications, () => bulkActionItemAlias2, NHibernate.SqlCommand.JoinType.LeftOuterJoin);
Run Code Online (Sandbox Code Playgroud)

这将崩溃,因为我两次使用相同的别名使用相同的联接。是否可以检查查询中是否已经存在联接,即使使用其他别名也是如此?

And*_*ker 0

我还没有找到实现此目的的内置方法。通常,我使用out带有扩展方法的参数来跟踪哪些表是查询的一部分。例如:

bool joinedOnBulkNotifications;

BulkNotification notificationAlias = null;

Expression<Func<object>> aliasExpr = () => notificationAlias;

var query = GetSession().QueryOver<Student>(() => studentAlias)
    .FilterByBulkNotificationStatus(
        someCondition, aliasExpr, out joinedOnBulkNotifications);


public static class QueryExtensions
{
    public static IQueryOver<Student, Student> FilterByBulkNotificationStatus(
        this IQueryOver<Student, Student> query,
        bool someCondition,
        Expression<Func<object>> aliasExpr,
        out bool joinedOnBulkNotifications)
    {
        joinedOnBulkNotifications = false;

        if (someCondition)
        {
            joinedOnBulkNotifications = true;
            query.JoinAlias(s => s.BulkNotifications, aliasExpr);
        }

        return query;
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是您可能需要重复使用稍后创建的别名。您可能会想传入 aBulkNotification并使用它,但这仅在参数名称与传递给扩展方法的变量名称匹配时才有效。NHibernate 使用变量的名称来创建别名,因此如果这两个名称不匹配,您将收到错误。因此,您需要将别名包装在 an 中Expression并使用它。

这不是一个非常干净的选择,所以我希望有人有更好的解决方案。