我有一个关于我编写的代码使用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;
}
我从来没有必要从查询中返回一个未填充的列,因此我不太确定如何执行此操作,或者如果在性能问题上这是可接受的。
我真的很感激一些建议!
由于
答案 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;
}