Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate为一对一映射生成过多查询_Nhibernate_One To One - Fatal编程技术网

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();