4

私はstackoverflowを初めて使用しますが、この質問が高く評価されることを願っています。

簡単に言うと、テーブルx左外部結合テーブルyからすべてを選択します。テーブルxの列が多すぎるため、新しいオブジェクトxを作成します。このオブジェクトは、プロジェクションに使用されます。テーブルxiのすべての列を投影できます。しかし、コレクション(テーブルyのコレクション)を投影/選択しようとすると、同じエラーが発生します:'インデックスが配列の境界外にありました'。

私の質問:NHibernateはコレクションの選択/投影をサポートしていますか?私はグーグル(そしてスタックオーバーフロー)で検索することによってこの質問を何度も見たが、それらの質問のどれも答えられなかったので。

コード例:

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>();
    }
}
4

1 に答える 1

3

返される結果は、コンテンツをそのままにしてグループ化する必要があります(したがって、SQLはグループ化されたアイテムに対してのみ集約できるため、sqlは出力されます)が、NHibernateは、グループ化するIDを知っているため、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;
于 2012-08-28T14:00:42.460 に答える