Nhibernate为一对一映射生成过多查询
当应用程序加载时,我将所有活动都存入内存:Nhibernate为一对一映射生成过多查询,nhibernate,one-to-one,Nhibernate,One To One,当应用程序加载时,我将所有活动都存入内存: var all = session.Query<Campaign>().ToList(); 这是服务地图: public ServiceMap() { Not.LazyLoad(); Table("`TR_Services`"); Id(x => x.Id, "ServiceID").GeneratedBy.Increment(); Map(x => x.Name,"ServiceName"); } 问题是,
var all = session.Query<Campaign>().ToList();
这是服务地图:
public ServiceMap()
{
Not.LazyLoad();
Table("`TR_Services`");
Id(x => x.Id, "ServiceID").GeneratedBy.Increment();
Map(x => x.Name,"ServiceName");
}
问题是,当我有100个活动,并且每个活动都有不同的服务时,映射会生成100个查询,以获取每个活动的服务。
例如,如果ServiceID 2在多个活动中重复自身,则查询…其中service0\u0.ServiceID=2
将只运行一次(这很好)
这是生成的查询:
SELECT service0_.ServiceID as ServiceID4_0_,
service0_.ServiceName as ServiceN2_4_0_
FROM [TR_Services] service0_
WHERE service0_.ServiceID = 8
这正常吗?当我有1000个活动和1000个服务或更多服务时,我会怎么做
谢谢
更新:我看到了您的编辑,我认为这是有效的。
但活动地图有更多的关系,例如:
HasMany(x => x.LandingPageWeights).KeyColumn("CampaignID").Not.LazyLoad();
如何根据您的查询进行处理?执行
LandingPageWeights=x.LandingPageWeights
失败….您对此有何建议?
谢谢通过阅读本文,您可以避免n+1问题 这就是答案 编辑 选择没有n+1问题的所有数据
var items = session.Query<Campaign>().Select(x=> new Campaign
{
Id = x.Id,
Service = new Service
{
Id = x.Service.Id,
Name = x.Service.Name
}
}).ToList();
var items=session.Query()。选择(x=>new活动
{
Id=x.Id,
服务=新服务
{
Id=x.Service.Id,
Name=x.Service.Name
}
}).ToList();
我想我找到了。
我已减少到2个问题:
var all = session.Query<Campaign>()
.Fetch(x => x.Service)
.Fetch(x => x.Supplier)
.ToList();
var all=session.Query()
.Fetch(x=>x.Service)
.Fetch(x=>x.Supplier)
.ToList();
这一个在一个查询中为我带来了服务
谢谢 多谢各位。我知道这一点,但我从来没有看到它在一对一的情况下发挥作用,这就是为什么我要问它。@SexyMF我想这是因为你没有懒惰的专栏服务。您可以使用linq投影查询或连接来避免itIMHO,获取连接不是一个好的建议,存在几个问题(例如分页、多个列表、不同的根问题等)。艾恩德斯的博客是从2006年开始的。@Stefan Steineggeragree@SexyMF然后,您应该从session.Query()开始,选择all之后,将数据转换为服务器端的活动->登录页面权重
var all = session.Query<Campaign>()
.Fetch(x => x.Service)
.Fetch(x => x.Supplier)
.ToList();