【发布时间】:2014-10-20 06:49:52
【问题描述】:
我有一个 PinballMachines 存储库,它返回一个水合的 PinballMachine 实体。它有一个私有属性,即在那台机器上玩的游戏列表。
弹球机可能会记录数以百万计的游戏。来自PinballMachine,我想拿高分来展示,这是前10名的游戏玩家。
public class PinballMachine
{
private IList<Game> _games = new List<Game>();
public virtual int ID { get; protected set; }
public virtual IEnumerable<Game> GetTop10Games()
{
return _games
.AsQueryable()
.OrderByDescending(g => g.Score)
.Take(10)
.ToList();
}
}
public class Game
{
public virtual Guid ID { get; protected set; }
public virtual string Name { get; set; }
public virtual int Score { get; set; }
public virtual decimal AmountPaid { get; set; }
}
PinballMachine 的_games 属性映射为Bag。
Bag<Game>("_games", m =>
{
m.Key(k => k.Column("PinballMachineID"));
m.Access(Accessor.Field);
m.Cascade(Cascade.All);
}, r => r.OneToMany());
以下代码运行正常,然而,NHibernate 在游戏表上执行一个非常简单的谓词,并在内存中执行排序和过滤。
-- SLOW! 1,000,000 records
SELECT ...
FROM Games
WHERE PinballMachineID = 123
这是非常不理想的,因为当我只需要 10 条记录时,数据库正在传输数百万条记录。
理想情况下,我希望 NHibernate 生成如下所示的查询:
-- FAST! 10 records
SELECT TOP 10 ...
FROM Games
WHERE PinballMachineID = 123
ORDER BY Score DESC
是否可以配置我的映射,以便我可以对水合对象执行额外的查询(在数据库上)。
我知道我可以使用 NHibernate 会话来执行 linq 查询,但是我希望这个逻辑成为我实体的一部分。
【问题讨论】:
-
听起来像这个stackoverflow.com/questions/2774095/…的复制品
-
这个问题看起来和我的问题一样,希望 NHibernate 已经取得了足够的进展来支持这个。
标签: c# sql .net linq nhibernate