【问题标题】:NHibernate C# inner join n+1NHibernate C# 内连接 n+1
【发布时间】:2013-09-13 12:13:44
【问题描述】:

这是我的简单 С# 代码:

var chests = _session.CreateCriteria<GameCharacterChest>()
    .CreateAlias("GameCharacterEquipments", "equip", JoinType.InnerJoin)
    .Add(Restrictions.Eq("GameCharacterId", characterId))
    .List<GameCharacterChest>();

foreach (var chest in chests)
{
    var equip = chest.GameCharacterEquipments.FirstOrNull();
    if (equip != null)
    {
        var slot = (equip as GameCharacterEquipment).GameCharacterSlotTypeId;
    } 
}

foreach 循环中,NHibernate 将 SQL 查询发送到我的数据库。为什么?关于GameCharacterEquipment 的信息已在内部连接的第一个查询中请求。 我有流利的地图。

【问题讨论】:

  • 请添加一些领域模型类和映射。这将导致更好的答案,因为可以猜测的更少。

标签: c# sql nhibernate fluent-nhibernate


【解决方案1】:

尝试添加

.SetFetchMode("GameCharacterEquipments", FetchMode.Join)

.SetFetchMode("GameCharacterEquipments", FetchMode.Eager)

各种调用之间(CreateAlias 之后)

您可能在GameCharacterEquipments 上定义了惰性关系。

【讨论】:

  • 不。这行不通。当我使用“左连接”而不是“内连接”时,一切都很好。但是,我这里需要“内连接”。
  • @nikashitsa 也许还有其他惰性表。您可以做的最好的事情是运行 SQL Server Profiler 并观察正在生成的查询。
  • 这里是 SQL 查询。 SELECT ... FROM game_character_chest this_ inner join game_character_equipment equip1_ on this_.id=equip1_.game_character_chest_id WHERE this_.game_character_id = ? SELECT ... FROM game_character_equipment gamecharac0_ WHERE gamecharac0_.game_character_chest_id=? 看起来不错。
  • @nikashitsa 所以它正在重新查询它已经拥有的一些数据......我不知道为什么。你应该检查FirstOrNull 函数...它是非标准的。
猜你喜欢
  • 1970-01-01
  • 2012-12-29
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
相关资源
最近更新 更多