1

我有一个关于我编写的使用 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

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

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

我从来不必从查询中返回未映射的列,所以我不太确定如何执行此操作,或者这在性能问题上是否可以接受。

我真的很感激一些建议!

谢谢

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 回答