0

当应用程序加载时,我将所有广告系列都加载到内存中:

var all = session.Query<Campaign>().ToList();

Campaign 有一项服务。

public CampaignMap()
{
  Table("`TR_Campaigns`");
  Schema("dbo");
  Not.LazyLoad();
  Id(x => .Id).GeneratedBy.Increment().Column("CampaignID");
  References(x => x.Service).Column("ServiceID").Not.LazyLoad();
  // I also tried hasone and it is bringing the same result
}

这是服务地图:

public ServiceMap()
{
  Not.LazyLoad();
  Table("`TR_Services`");
  Id(x => x.Id, "ServiceID").GeneratedBy.Increment();
  Map(x => x.Name,"ServiceName");
}

问题是,当我有 100 个活动,并且每个活动有不同的服务时,映射会生成 100 个查询来获取每个活动的服务。例如,如果 ServiceID 2 在多个活动中重复,则查询… WHERE service0_.ServiceID = 2将只运行一次(这很好)。

这是生成的查询:

SELECT service0_.ServiceID   as ServiceID4_0_,
       service0_.ServiceName as ServiceN2_4_0_
FROM   [TR_Services] service0_
WHERE  service0_.ServiceID = 8

这正常吗?当我有 1000 个活动和 1000 项服务甚至更多时,我会怎么做……</p>

谢谢

更新
我看到你的编辑,我认为它是有效的。
但是 CampaignMap 的关系比较多,例如:

 HasMany(x => x.LandingPageWeights).KeyColumn("CampaignID").Not.LazyLoad();

根据您的查询,我该如何处理?
LandingPageWeights = x.LandingPageWeights失败....
你对此有何建议?
谢谢

4

2 回答 2

1

您可以通过阅读本文来避免 n+1 问题

http://ayende.com/blog/1328/combating-the-select-n-1-problem-in-nhibernate

这就是答案

防止 Fluent NHibernate 选择 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();
于 2013-01-30T08:09:54.143 回答
1

我想我找到了。我已减少到 2 个查询:

var all = session.Query<Campaign>()
                            .Fetch(x => x.Service)
                            .Fetch(x => x.Supplier)
                            .ToList();

这个在一个查询中为我带来了服务。

谢谢!!

于 2013-01-30T12:30:50.437 回答