0

アプリケーションが読み込まれると、すべてのキャンペーンがメモリにチャージされます。

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

キャンペーンには 1 つのサービスがあります。

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は 1 回だけ実行されます (これは良いことです)。

生成されたクエリは次のとおりです。

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

それは正常ですか?1,000 個以上のサービスを含む 1,000 個のキャンペーンがある場合、どうすればよいでしょうか…</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 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();
于 2013-01-30T08:09:54.143 に答える
1

見つけたと思います。私は2つのクエリに減少しました:

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

これは、1 つのクエリでサービスを提供してくれます。

ありがとうございました!!

于 2013-01-30T12:30:50.437 に答える