使用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);
这会崩溃,因为我使用不同的别名进行了两次相同的连接。是否可以检查查询中是否已存在联接,即使使用不同的别名?
答案 0 :(得分: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;
}
}
问题是您可能需要重复使用稍后创建的别名。您可能想要传入BulkNotification
并使用它,但这仅在参数名称与传递给扩展方法的变量的名称匹配时才有效。 NHibernate使用变量的名称来创建别名,因此如果这两个名称不匹配,您将收到错误。因此,您需要将别名包装在Expression
中并改为使用它。
这不是一个非常干净的选择,所以我希望有人有更好的解决方案。