2012-09-23 52 views
0

假设我有以下情况。有两个表格CounterpartiesEvents。一个交易对手可以有0个,1个或多个相关事件。NHibernate性能和一对多关系

我想获得与最新的事件对手名单,以显示ID的DataGrid,所以我创建:

两个实体:

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; } 
} 

两个映射:

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; } 
} 

最后方法负责与最新的事件创建所有counteparties的列表:

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; 
    } 

的prefromance是不可接受的,对于30个对手和10个事件的数据处理需要5秒。

我想在检查最新事件时,NHiberante会为每一个对方执行单独的数据库查询。

问题是:我能做些什么来提高性能?

回答

1

很可能您需要将.Fetch.Subselect()添加到HasMany()映射中。有关该here的更多信息。但这只是一个猜测,请显示您的代码加载数据以获得更好的答案。

您还应该将您的收藏标记为反面(.Inverse()HasMany()),否则您会在插入新活动时遇到问题。

+0

我已经添加了一段代码负责数据加载:只是简单的QueryOver调用在最后一块代码。感谢您的解释和提示! – Radek