Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
NHibernate检查QueryOver中的相同联接_Nhibernate_Queryover - Fatal编程技术网

NHibernate检查QueryOver中的相同联接

NHibernate检查QueryOver中的相同联接,nhibernate,queryover,Nhibernate,Queryover,使用QueryOver,我创建了一个这样的查询 BulkActionItem bulkActionItemAlias1 = null; BulkActionItem bulkActionItemAlias2 = null; var query = GetSession().QueryOver<Student>(() => studentAlias) .JoinAlias(() => studentAlias.BulkNotifications, () =

使用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);
BulkActionItem bulkActionItemAlias1=null;
BulkActionItem bulkActionItemAlias2=null;
var query=GetSession().QueryOver(()=>studentAlias)
.JoinAlias(()=>studentAlias.BulkNotifications,()=>bulkActionItemAlias1,NHibernate.SqlCommand.JoinType.LeftOuterJoin);
if(query.underlineCriteria.GetCriteriaByAlias(“bulkActionItemAlias2”)==null
query=query.JoinAlias(()=>studentAlias.BulkNotifications,()=>bulkActionItemAlias2,NHibernate.SqlCommand.JoinType.LeftOuterJoin);

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

我还没有找到实现这一点的内置方法。通常我使用带有扩展方法的
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;
    }
}
bool-joinedbulknotifications;
BulkNotification notificationAlias=null;
表达式别名expr=()=>notificationAlias;
var query=GetSession().QueryOver(()=>studentAlias)
.FilterByBulkNotificationStatus(
someCondition、aliasExpr、out-joinednublknotifications);
公共静态类QueryExtensions
{
公用静态IQueryOver FilterByBulkNotificationStatus(
这是一个很好的问题,
在某种情况下,
表达式aliasExpr,
外螺纹接头(非螺栓连接)
{
JoinedOnBulkKnotifications=false;
如果(某些条件)
{
JoinedOnBulkKnotifications=真;
JoinAlias(s=>s.BulkNotifications,aliasExpr);
}
返回查询;
}
}
问题是,您可能需要重用稍后创建的别名。您可能会尝试传入一个
BulkNotification
并使用它,但这仅在参数名与传递给扩展方法的变量名匹配时起作用。NHibernate使用变量名创建别名,如果这两个名称不匹配匹配,您将得到一个错误。因此,您需要将别名包装在
表达式中,然后使用该表达式


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

您总是加入到
BulkNotifications
,那么为什么要在
if
语句中再次加入呢?这只是一个片段。在完整的代码中有很好的理由,即根据所需的条件通过扩展方法添加连接。