0

次のケースがあるとしましょう。との 2 つのテーブルがCounterpartiesありEventsます。1 つの取引相手は、0、1、またはそれ以上の関連イベントを持つことができます。

ID DataGrid を表示するために、最新のイベントでカウンターパーティ リストを取得したいので、次のように作成しました。

2 つのエンティティ:

public class Counterparty
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }

    public virtual IList<Event> Events { get; set; }

    public Counterparty()
    {
        Events = new List<Event>();
    }
} 

public class Event
{
    public virtual int Id { get; set; }
    public virtual DateTime EventDate { get; set; }
    public virtual string Description { get; set; }
    public virtual Counterparty Counterparty { get; set; }
}

2 つのマッピング:

public class CounterpartyMap : ClassMap<Counteparty>
{
    public CounterpartyMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        HasMany<Event>(x => x.Events);
    }
}

public class EventMap : ClassMap<Event>
{
    public Event()
    {
        Id(x => x.Id);
        Map(x => x.EventDate);
        Map(x => x.Description);
        Reference(x => x.Counterparty);
    }
}

Counterparty最新のものを含むためのヘルパー クラスEvent

public class LastestCounterpartyEvent
{
    public Counterparty Counterparty { get; set; }
    public ScoringResult ScoringResult  { get; set; }
}

そして最後に、最新のイベントを持つすべてのカウンターパーティのリストを作成するメソッド:

    public IList<LastestCounterpartyEvent> All()
    {
        // Added line of code responsible for data loading
        var allCounterparties = DataContext.Session.QueryOver<Counterparty>().List();
        return allCounterparties.Select(Prepare).ToList();
    }

    private LastestCounterpartyEvent Prepare(Counterparty counterparty)
    {
        var lastestCounterpartyEvent = new LastestCounterpartyEvent {Counterparty = counterparty};
        if (counterparty.Events.Count > 0)
            lastestCounterpartyEvent.Event = 
                counterparty.Events.OrderByDescending(x => x.EventDate).First();

        return lastestCounterpartyEvent;
    }

30 のカウンターパーティと 10 のイベントのデータ処理に 5 秒かかるため、優先順位は受け入れられません。

NHiberante は、最新のイベントをチェックする際に、カウンターパーティごとに個別のデータベース クエリを実行すると思います。

問題は、パフォーマンスを向上させるために何ができるかということです。

4

1 に答える 1

1

ほとんどの場合、マッピングに追加する必要があり.Fetch.Subselect()ますHasMany()。詳細については、こちらをご覧ください。しかし、それは推測にすぎません。より良い回答を得るためにデータをロードするコードを示してください。

また、コレクションを逆 ( .Inverse()on HasMany()) としてマークする必要があります。そうしないと、新しいイベントを挿入する際に問題が発生します。

于 2012-09-26T12:48:14.830 に答える