0
假设我有以下情况。有两个表格Counterparties
和Events
。一个交易对手可以有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会为每一个对方执行单独的数据库查询。
问题是:我能做些什么来提高性能?
我已经添加了一段代码负责数据加载:只是简单的QueryOver调用在最后一块代码。感谢您的解释和提示! – Radek