Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/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_Subquery_Queryover - Fatal编程技术网

nhibernate queryover与子查询连接以获取聚合列

nhibernate queryover与子查询连接以获取聚合列,nhibernate,subquery,queryover,Nhibernate,Subquery,Queryover,我已经找了好几个小时了,但似乎找不到任何帮助 以下是数据库模型: 这是我正在尝试运行的SQL查询: SELECT b.*, a.Assignments FROM Branch b LEFT JOIN ( SELECT b.BranchID , COUNT(ab.BranchID) AS Assignments FROM Branch b LEFT JOIN AssignmentBranch ab ON b.BranchID = ab.BranchID

我已经找了好几个小时了,但似乎找不到任何帮助

以下是数据库模型:

这是我正在尝试运行的SQL查询:

SELECT b.*, a.Assignments FROM Branch b LEFT JOIN (
        SELECT b.BranchID , COUNT(ab.BranchID) AS Assignments
        FROM Branch b LEFT JOIN AssignmentBranch ab ON b.BranchID = ab.BranchID
        GROUP BY b.BranchID
      ) a ON b.BranchID = a.BranchID
因此,基本上,我想返回一个分支列表和一个新列,该列表示该分支的分配数量

分支模型

public class Branch : IEntity<int>
{
    public virtual int ID
    {
        get;
        set;
    }

    public virtual string Name { get; set; }

    public virtual IList<AssignmentBranch> Assignments { get; set; }

}
public class AssignmentBranch : IEntity<int>
{
    public virtual int ID
    {
        get;
        set;
    }

    public virtual DateTime AssignedOn { get; set; }

    public virtual Branch Branch { get; set; }
}
公共类分支:IEntity
{
公共虚拟整数ID
{
得到;
设置
}
公共虚拟字符串名称{get;set;}
公共虚拟IList分配{get;set;}
}
分配分支模型

public class Branch : IEntity<int>
{
    public virtual int ID
    {
        get;
        set;
    }

    public virtual string Name { get; set; }

    public virtual IList<AssignmentBranch> Assignments { get; set; }

}
public class AssignmentBranch : IEntity<int>
{
    public virtual int ID
    {
        get;
        set;
    }

    public virtual DateTime AssignedOn { get; set; }

    public virtual Branch Branch { get; set; }
}
公共类分配分支:IEntity
{
公共虚拟整数ID
{
得到;
设置
}
在{get;set;}上分配的公共虚拟日期时间
公共虚拟分支分支{get;set;}
}
以下是我的NHibernate配置:

<class name="Branch" table="Branch">

<id name="ID" column="BranchID">
  <generator class="identity"></generator>
</id>

<property name="Name"/>

<bag name="Assignments" cascade="none" inverse="true">
  <key column="BranchID"/>
  <one-to-many class="AssignmentBranch"/>
</bag>


我已经尝试了很多方法,但是我似乎找不到一种使用QueryOver连接子查询的方法

我试着这样做:

 // aliases
 Branch branch = null; AssignmentBranch assignment = null;

 var subquery = QueryOver.Of<Branch>(() => branch)
     .Where(() => branch.Project.ID == projectID)
     .JoinQueryOver<AssignmentBranch>(() => branch.Assignments, ()=> assignment, 
                                   NHibernate.SqlCommand.JoinType.LeftOuterJoin)
     .SelectList(list => list
                        .SelectGroup(x=>x.ID)
                        .SelectCount(()=>assignment.ID)
                    );

     var query = session.QueryOver<Branch>(()=>branch)
                  .JoinAlias(???) // how can I join with a sub-query?
                  .TransformUsing(Transformers.AliasToBean<BranchAssignments>())
                  .List<BranchAssignments>();
//别名
Branch=null;AssignmentBranch assignment=null;
var subquery=QueryOver.Of(()=>分支)
.Where(()=>branch.Project.ID==projectID)
.JoinQueryOver(()=>分支.Assignments,()=>assignment,
NHibernate.SqlCommand.JoinType.LeftOuterJoin)
.SelectList(list=>list
.SelectGroup(x=>x.ID)
.SelectCount(()=>assignment.ID)
);
var query=session.QueryOver(()=>branch)
.JoinAlias(???)//如何使用子查询进行连接?
.TransformUsing(Transformers.AliasToBean())
.List();
有人能帮我吗?它不一定是一个子连接,也许有另一个更好的解决方案,我错过了

谢谢,,
Cosmin

在阅读了这里的数百个类似问题后,我找到了答案:一个相关的子查询。像这样:

// aliases
Branch branch = null; AssignmentBranch assignment = null;

var subquery = QueryOver.Of<AssignmentBranch>(() => assignment)
    .Where(() => assignment.Branch.ID == branch.ID)
    .ToRowCountQuery();

var query = session.QueryOver<Branch>(() => branch)
     .Where(() => branch.Project.ID == projectID)
     .SelectList
     (
         list => list
         .Select(b => b.ID)
         .Select(b => b.Name)
         .SelectSubQuery(subquery)
     )
     .TransformUsing(Transformers.AliasToBean<BranchAssignments>())
     .List<BranchAssignments>();
//别名
Branch=null;AssignmentBranch assignment=null;

var subquery=QueryOver.Of

使用QueryOver并不是那么容易,因为目前无法在FROM子句中包含语句。我想到的一件事(不是我认为最有效的方式)

var branchs=session.QueryOver().Future();
var assignmentMap=session.QueryOver()
.选择(
Projections.Group(ab=>ab.Branch.Id).As(“UserId”),
Projections.RowCount())
.Future()
.ToDictionary(o=>(int)o[0],o=>(int)o[1]);
返回branchs.Select(b=>new{Branch=Branch,AssignmentCount=assignmentMap[Branch.Id]});
有了林克,一切都会好起来

var branchesWithAssignementCount = session.Query<Branch>()
    .Select(b => new { Branch = b, AssignmentCount = b.Branch.Count })
    .ToList();
var brancheswithassignmentcount=session.Query()
.Select(b=>new{Branch=b,AssignmentCount=b.Branch.Count})
.ToList();

真不错。我认为您需要整个分支对象,而不仅仅是一些属性。我需要它用一些分支属性和赋值计数填充自定义实体。不过,感谢您花时间回复,我认为您的回答也很有趣。这将创建一个嵌套子查询,而不是左连接。我认为这比连接的性能要差得多(尽管SQL查询优化器不断让我感到惊讶:-),我在SQL Server中运行了两个查询,并查看了执行计划。查询引擎获取相关子查询并将其转换为右外部联接。这意味着无论哪种方式,性能都是相同的。@AndrewShepherd我知道你很久以前就做过这个分析,但谢谢你这么做。我正在阅读这个解决方案,也有类似的担忧。你的工作减轻了那些恐惧。非常感谢。