当应用程序加载时,我会将所有广告系列收费到内存中:
var all = session.Query<Campaign>().ToList();
广告系列有一项服务。
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个服务甚至更多的活动时,我该怎么办...
由于
更新:
我看到你的编辑,我认为这是工作
但CampaignMap有更多关系,例如:
HasMany(x => x.LandingPageWeights).KeyColumn("CampaignID").Not.LazyLoad();
如何根据您的查询处理它?
执行LandingPageWeights = x.LandingPageWeights
失败....
你对此有何建议?
感谢
答案 0 :(得分:1)
阅读本文
可以避免n + 1问题http://ayende.com/blog/1328/combating-the-select-n-1-problem-in-nhibernate
这样回答
Prevent Fluent NHibernate select 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();
答案 1 :(得分:1)
我想我找到了它。 我减少了2个查询:
var all = session.Query<Campaign>()
.Fetch(x => x.Service)
.Fetch(x => x.Supplier)
.ToList();
这个在一个查询中为我提供服务。
谢谢!