これを行う方法は数時間前から検索されていますが、何か助けになるとは思えません。ここでnhibernate 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
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; }
}
AssignmentBranchモデル
public class AssignmentBranch : IEntity<int>
{
public virtual int ID
{
get;
set;
}
public virtual DateTime AssignedOn { get; set; }
public virtual Branch Branch { 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>
<class name="AssignmentBranch" table="AssignmentBranch">
<id name="ID" column="AssignmentBranchID">
<generator class="identity"></generator>
</id>
<property name="AssignedOn" />
<property name="FromDate" />
<property name="ToDate" />
<many-to-one name="Assignment" column="AssignmentID" />
<many-to-one name="Branch" column="BranchID" />
私はこれをいくつかの方法で試しましたが、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>();
誰も私を助けてくださいことはできますか?それはここに同様の質問の数百を読んだ後
いいだろうLINQで私の心に来ることの一つ(私は考えていない、最も効率的な方法)
。私はあなたがBranchオブジェクト全体といくつかのプロパティだけでなく必要と思った。 – Firo
いくつかのブランチプロパティと割り当ての数を持つカスタムエンティティを設定する必要があります。それにもかかわらず、返信する時間をとってくれてありがとう、私はあなたの答えはまた面白いと思う。 – noir
これにより、左結合ではなくネストされた副問合せが作成されます。 SQLクエリオプティマイザが私を驚かせてくれました:-) –