1

この例を見てください:

(ドメイン オブジェクトの代わりにカスタム オブジェクトを返す NHibernate を使用してストアド プロシージャを呼び出すことは可能ですか? )

私の構造がこの定義を持っているとします:

public class YourDto
{
    public int YourDtoId { get; set; }
    public string YourDtoTitle { get; set; }
    public List<YourDtoBook> YourDtoList { get; set; }
}

そして、次のようなクエリが 1 つあるとします。

select yourColumn1 as YourDtoId, yourColumn2 as YourDtoTitle,
yourColumn3 as YourDtoList from YOUR_TABLE

このクエリの結果は次のようになります。

YourDtoId| YourDtoTitle| YourDtoList
_____________________________________
1        |Jeff         | book1
1        |Jeff         | book2
2        |Kurt         | book3
2        |Kurt         | book4

これらのエンティティを正しくマッピングするにはどうすればよいですか? (つまり、それぞれに 2 つのリストを持つ 2 つのオブジェクト)

4

1 に答える 1

0

マップされたクラスで QueryOver を使用すると、Fetch Eager が使用されます。

おそらくGroupByを使用してDTOに直接:

var result = yourNhSession.CreateSQLQuery(@"
                select yourColumn1 as YourDtoId, yourColumn2 as YourDtoTitle,
                yourColumn3 as YourDtoList from YOUR_TABLE")
                .List<object[]>()
                .GroupBy(x => new
                {
                    YourDtoId = (int) x[0],
                    YourDtoTitle = (string) x[1]
                })
                .Select(x => new YourDto
                {
                    YourDtoId = x.Key.YourDtoId,
                    YourDtoTitle = x.Key.YourDtoTitle,
                    YourDtoList = x.Select(y => new YourDtoBook
                    {
                        Name = (string)y[2]
                    }).ToList()
                });

    public class YourDto
    {
        public int YourDtoId { get; set; }
        public string YourDtoTitle { get; set; }
        public List<YourDtoBook> YourDtoList { get; set; }
    }

    public class YourDtoBook
    {
        public string Name { get; set; }
    }
于 2013-09-20T22:49:46.717 に答える