1

次のようなデータモデルがあります。

class Hand {
    public int id;
    ...
}
class Person {
    public int id;
    public string name;
    public IList<Hand> hands;
    ...
}

データベースからデータを取得するには、次のようにします。

ICriteria criteria = databaseSession.CreateCriteria(typeof(Person));

ProjectionList projections = Projections.ProjectionList();

projections
    .Add(Projections.Property("id").As("id"))
    .Add(Projections.Property("name").As("name"))
    .Add(Projections.Property("hands").As("hands"));

projections.Add(Projections.GroupProperty("id"));
projections.Add(Projections.Count("id"), "count");

criteria.SetProjection(projections);

criteria.SetResultTransformer(
    NHibernate.Transform.Transformers.AliasToBean(typeof(PersonDTO)));

しかし、NHibernate は、hands プロパティにネストされたオブジェクトをロードしません。null を与えるだけです。ネストされたオブジェクトを埋める方法も教えてください(複数のレベルの深さ)。クエリの代わりにプロジェクションを使用する方が良いでしょう。注: プロジェクションなしでデータをロードすると、うまく機能したため、マッピングでは問題になりません。

4

1 に答える 1

1

可能な解決策

var query = databaseSession.CreateCriteria(typeof(Person))
    .JoinAlias("hands", "hand")
    .SetProjection(Projections.ProjectionList()
        .Add(Projections.Property("Id"))
        .Add(Projections.Property("Name"))
        .Add(Projections.Property("hand.Id"))
        .Add(Projections.Property("hand.Foo")))
    .List<object[]>()
    .GroupBy(arr => (int)arr[0])
    .Select(g => new PersonDTO
    {
        Id = g.Key,
        Name = g.First().Name,
        Hands = g.Select(arr => new Hand { Id = arr[2], Foo = arr[3] }).ToList(),
    });

var results = query.ToList();
于 2013-06-07T12:30:15.320 に答える