3

List として保存されている Property エンティティのすべてのレコードを取得しようとしています。このエンティティには写真のコレクションがあり、このコレクションには最大 5 つの画像を入力できます。

読み込み時間を短縮するために、プロパティのリストを取得し、各プロパティ内ではコレクションから最初の写真のみを取得したいと考えています。このクエリ以来

List<Domain.Property> data = session.Query<Domain.Property>()
                       .Fetch(x => x.Photos.First())
                       .ToList();

このエラーが発生します。フェッチ要求は、単純なメンバー アクセス式である必要があります。'[100002]' は代わりに SubQueryExpression です。パラメータ名: relatedObjectSelector.

だから私は使う

List<Domain.Property> data = session.Query<Domain.Property>()
                       .ToList();

リストとforeachループでプロパティを取得して、すべてのプロパティにアクセスし、nhib内に写真オブジェクトをロードしようとしました。このようなセッション

 var a = PropertyViewModel.FromDomainModel(data, session);

 public static List<PropertyViewModel> FromDomainModel(IList<Property> x, ISession session)
        {
            List<PropertyViewModel> dataVm = new List<PropertyViewModel>();

            foreach (Property p in x)
            {
                Photo firstPhoto = session.Get<Photo>(p.Photos[0].Id);

                dataVm.Add(new PropertyViewModel(p, firstPhoto));
            }
            return dataVm;
        }

public PropertyViewModel(Property x, Photo y)
        {
            Id = x.Id;
            ...
            Photo = new Photo();
            Photo = y;
        }

このアプローチは (少なくとも私にとっては :)) うまく見えますが、nhib に従ってロードされます。プロファイラー 65 個のエンティティ (そのうち、写真識別子は 46 個の読み込み、プロパティ 19 個の識別子)。 (すべてのプロパティの 19 のプロパティ ID と 19 の写真 ID の最初の画像をロードする必要があります)。

ここで何を間違えるべきですか?

私は予測に慣れていないので、これが最後の解決策になるはずです。

ありがとう

4

2 に答える 2

1

.Select()プロジェクション ( ) 呼び出しなしではそれができないと思います。

foreach を使用すると非常に多くの写真が読み込まれる理由は、Photos コレクションにアクセスして、p.Photos[0]NHibernate のコレクションに対する遅延読み込みをトリガーするためです。すべての写真がデータベースから読み込まれ、最初の写真がインデクサーで選択され[0]ます。

インスタンスではなく動的プロキシ オブジェクトで.First()呼び出しているため、インデクサーの代わりにLINQ のメソッドを使用している場合でも、おそらくここで遅延読み込みがトリガーされます。IQueryable

于 2012-05-31T00:52:30.660 に答える
0

Domain.Photo と Domain.Property の間に関係がある場合は、Photo に対してクエリを実行し、Property を積極的にロードする方が簡単です (これがコンパイルされるかどうかはテストしていませんが、一般的なアイデア):

var subQuery = QueryOver.Of<Domain.Property>().Select(x => x.Min(y => y.Photos));
List<Domain.Photo> data = session.QueryOver<Domain.Photo>()
     .WhereRestrictionOn(x => x.Id).IsIn(subQuery)
     .Fetch(x => x.Property).Eager
     .List();
于 2012-05-31T14:38:18.743 に答える