1

NHibernateを使用してプロシージャを呼び出し、マップされていないエンティティを入力してから、子エンティティのリストをフェッチするために作成したコードについて質問があります。

例を示します。3つのエンティティ:家、関心、ユーザー

class house
string name; string title; string description;
list<interest> users;

ランキング、保存する必要のあるコメントなどの追加のプロパティがいくつかあるため、家とユーザーの関係のクラスとしてインタレストを使用します。

class interest
house houseinterested;
user userinterested;
int ranking; string descriptions;

そしてユーザークラス

class user
string name

エリア範囲内のすべての家をクエリする必要があるため、ストアドプロシージャでその計算を実行し(緯度/経度を送信)、ビューに表示する必要のある追加のプロパティ距離を返します。

距離をテーブルにマップしたくないので(取得するだけなので、その値を保存することはありません)、houseに似ていますが、distanceプロパティ(houseview)を使用して別のエンティティを作成し、プロシージャをクエリしていますCreateSQLQueryを使用する場合:

const string sql = "call imovel_within_area (:@orig_lat, :@orig_long, :@dist, :@take, :@skip, :@quartos, :@precomin, :@precomax)";
            var query = MvcApplication.Session.CreateSQLQuery(sql)
                .SetParameter("@dist", distancia)
                .SetParameter("@orig_lat", latitude) //-25.363882m
                .SetParameter("@orig_long", longitude) // 131.044922m
                .SetParameter("@take", resultados)
                .SetParameter("@skip", ((pagina-1 * resultados)))
                .SetParameter("@quartos", quartos.Value)
                .SetParameter("@precomin", precomin.Value)
                .SetParameter("@precomax", precomax.Value);
                query.SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(Core.Domain.houseview)));

今、私は興味のあるユーザーのリストを埋めたいと思います。

foreach (var housein houses.List<Core.Domain.houseview>())
            {
              house.Where(x => x.Id == house.Id).ToList().First().Interest =
              MvcApplication.Session.QueryOver<Core.Domain.House>()
              .Where(x => x.Id == imovel.Id).List().First().Interessados;
            }

クエリからマップされていない列を返す必要がなかったので、これを行う方法や、パフォーマンスの問題でこれが許容できるかどうかはよくわかりません。

いくつかアドバイスをいただければ幸いです。

ありがとう

4

1 に答える 1

0
List<Core.Domain.houseview> houseviews = ...;

// load all wanted houses into session cache
MvcApplication.Session.QueryOver<Core.Domain.House>()
    .WhereRestrictionOn(x => x.Id).In(houseviews.Select(hv => hv.Id).Tolist())
    .Fetch(x => x.Interessados).Eager
    .List()

foreach (var view in houseviews)
{
    view.Interessados = Session.Get<house>(view.House.Id).Interessadoes;
}
于 2012-08-20T04:28:05.017 に答える