Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/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在许多表格上查询_Nhibernate_Queryover - Fatal编程技术网

NHibernate在许多表格上查询

NHibernate在许多表格上查询,nhibernate,queryover,Nhibernate,Queryover,有一个实体努力具有属性列表和属性AdType 我们有几个adTypesenum对象和specialListsenum对象可供选择IList 我是这样做的: return NHibernateSession.QueryOver<Effort>() .JoinQueryOver(effort => effort.AdType) .WhereRestrictionOn(adType => adType.Id)

有一个实体努力具有属性列表和属性AdType 我们有几个adTypesenum对象和specialListsenum对象可供选择
IList

我是这样做的:

    return NHibernateSession.QueryOver<Effort>()
        .JoinQueryOver(effort => effort.AdType)
                .WhereRestrictionOn(adType => adType.Id)
                .IsIn(adTypes.Select(adt => (long)adt).ToList())
            .Clone()
            .JoinQueryOver(effort => effort.List)
                .WhereRestrictionOn(list => list.Id)
                .IsIn(specialLists.Select(sl => (long)sl).ToList())
            .List<Effort>();
返回NHibernateSession.QueryOver()
.JoinQueryOver(effort=>effort.AdType)
.WhereRestrictionOn(adType=>adType.Id)
.IsIn(adTypes.Select(adt=>(long)adt.ToList())
.Clone()
.JoinQueryOver(efforce=>efforce.List)
.WhereRestrictionOn(list=>list.Id)
.IsIn(specialLists.Select(sl=>(long)sl.ToList())
.List();
正如你所看到的,我使用了一个奇怪的Clone()方法,它没有任何描述。它工作得很好

您以何种方式使用QueryOver进行此类查询?

.JoinQueryOver(effort=>effort.AdType)
将返回带有子类型的QueryOver,此处
AdType
IQueryOver
而不是原始的
IQueryOver
。第一个泛型参数是queryType,第二个泛型参数是在其上操作方法的类型。如果在两者之间进行克隆,则整个查询将被复制并作为basequery
IQueryOver
返回

为了防止查询切换到子类型,JoinAlias创建了一个别名,而不是降序

AdType adAlias = null;
ListType listAlias = null;

return NHibernateSession.QueryOver<Effort>()
    .JoinAlias(effort => effort.AdType, () => adAlias)
    .JoinAlias(effort => effort.List, () => listAlias)
    .WhereRestrictionOn(() => adAlias.Id).IsIn(adTypes.Cast<long>().ToList())
    .WhereRestrictionOn(() => listAlias.Id).IsIn(specialLists.Cast<long>().ToList())
    .List<Effort>();
AdType adAlias=null;
ListType listAlias=null;
返回NHibernateSession.QueryOver()
.JoinAlias(effort=>effort.AdType,()=>adAlias)
.JoinAlias(efforce=>efforce.List,()=>listAlias)
.WhereRestrictionOn(()=>adAlias.Id).IsIn(adTypes.Cast().ToList())
.WhereRestrictionOn(()=>listalis.Id).IsIn(specialists.Cast().ToList())
.List();
如果只限制adtype和listtype的Id,那么

return NHibernateSession.QueryOver<Effort>()
    .WhereRestrictionOn(effort => effort.Adtype.Id).IsIn(adTypes.Cast<long>().ToList())
    .WhereRestrictionOn(effort => effort.List.Id).IsIn(specialLists.Cast<long>().ToList())
    .List<Effort>();
返回NHibernateSession.QueryOver()
.WhereRestrictionOn(effort=>effort.Adtype.Id).IsIn(adTypes.Cast().ToList())
.WhereRestrictionOn(efforce=>efforce.List.Id).IsIn(specialists.Cast().ToList())
.List();

我很好奇,如果省略克隆,会发生什么情况,也会向数据库触发什么SQL?如果没有克隆(),它将不会尝试执行以下工作。它将尝试对AdType执行此操作。因此将不会有.JoinQueryOver(efforce=>efforce.List),而是.JoinQueryOver(adType=>adType…)