NHibernate - 从未编写的类中填充子实体

时间:2012-08-17 15:39:41

标签: nhibernate fluent-nhibernate

我有一个关于我编写的代码使用NHibernate调用过程的问题,填充一个未填充的实体,然后获取子实体列表。

我会告诉你一个例子。三个实体:住宅,兴趣,用户

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

因为我需要查询所有带有区域范围的房屋,我正在对存储过程进行计算(发送lat / long),然后我返回一个额外的属性距离我需要在视图上显示。

我不想将距离映射到表格(因为我只是检索它,我从不存储该值),所以我创建了另一个类似于house的实体,但是距离属性(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;
            }

我从来没有必要从查询中返回一个未填充的列,因此我不太确定如何执行此操作,或者如果在性能问题上这是可接受的。

我真的很感激一些建议!

由于

1 个答案:

答案 0 :(得分: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;
}