[英]NHibernate Projections (QueryOver.SelectList) limits
我是stackoverflow的新手,我希望這個問題值得贊賞。
簡單地說:我從表x左外連接表y中選擇所有內容。 表x有太多列,所以我創建新對象x。 此對象用於投影。 我可以預測表xi想要的每一列。 但是當我嘗試投影/選擇一個集合(表y的集合)時,我得到了同樣的錯誤:'索引超出了數組的范圍'。
我的問題:NHibernate是否支持選擇/投射一個集合? 因為我通過搜索谷歌(和stackoverflow)多次看到這個問題,但沒有一個問題得到解答。
代碼示例:
public class X
{
public virtual int ID { get; set; }
public virtual int IDontNeedMoreInfoAboutClassXItTakesToMuchTimeToRetrieve { get; set; }
public virtual IList<Y> YCollection { get; set; }
}
public class Y
{
public virtual int YID { get; set; }
}
public class XRepository{
public ISession Session {get; set;}
public IList<X> Get()
{
X xAlias = null;
Y yAlias = null;
X resultAlias = null;
return Session.QueryOver<X>()
.JoinAlias(() => xAlias.YCollection, () => yAlias, JoinType.LeftOuterJoin)
.SelectList(list => list
.SelectGroup(() => xAlias.ID).WithAlias(() => resultAlias.ID)
.SelectGroup(() => xAlias.YCollection).WithAlias(() => resultAlias.YCollection)) // Index was outside the bounds of the array
.TransformUsing(Transformers.AliasToBean<X>()).List<X>();
}
}
返回的結果必須與內容完整分組(因此sql已經輸出,因為它只能聚合分組的項目)但是NHibernate只能為m,apped實體執行此操作,因為它知道要分組的標識。 手動完成很簡單
Y yAlias = null;
var tempResults = Session.QueryOver<X>()
.JoinAlias(x => x.YCollection, () => yAlias, JoinType.LeftOuterJoin)
.SelectList(list => list
.Select(() => xAlias.Id)
.Select(() => xAlias.Name)
...
.Select(() => yAlias.Id)
...
.ToList<object[]>()
List<X> results = new List<X>(100); // switch to Hashset if too slow and order does not matter
foreach(var row in tempResults)
{
Y y = new Y { Id = (long)row[4], ... };
X x = results.FirstOrDefault(x => x.Id == (long)row[0]));
if (x != null)
x.YCollection.Add(y);
else
results.Add(new X { Id = (long)row[0], ..., YCollection = { y } };
}
return results;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.