NHibernate和;“匿名”;实体

NHibernate和;“匿名”;实体,nhibernate,entity,Nhibernate,Entity,我有以下实体: public class Parent { public int Foo { get; set; } public Child C { get; set; } } public class Child { public string Name { get; set; } } 我有一个从数据库中获取所有父实体的查询。然后我将它们保存在内存中,并使用LINQ查询对它们进行过滤 我注意到,当我执行DB查询时,NH会在一个查询中选择所有父实体(当然会填充Foo

我有以下实体:

public class Parent
{
    public int Foo { get; set; }
    public Child C { get; set; }
}

public class Child
{
    public string Name { get; set; }
}
我有一个从数据库中获取所有父实体的查询。然后我将它们保存在内存中,并使用LINQ查询对它们进行过滤

我注意到,当我执行DB查询时,NH会在一个查询中选择所有父实体(当然会填充Foo属性),对于我使用LINQ访问的每个父实体,NH会获取每个子实体的信息

如何在一个唯一的数据库中获取所需的所有信息,并在没有LINQ的情况下使用数据生成额外的数据库行程

我应该使用别名BeanResultTransformer吗?如果是这样,我必须创建一个DTO来存储信息,如:

public class ParentDTO
{
    public int Foo { get; set; }
    public string ChildName { get; set; }
}
或者我必须仍然使用父类


提前感谢

您需要告诉NHibernate不要对父实体和子实体之间的关系使用延迟加载。

您需要告诉NHibernate不要对父实体和子实体之间的关系使用延迟加载。

您可以像这样急切地加载此查询的子实体(使用QueryOver语法)

public IList FindAllParentsWithChildren()
{
ISession s=//获取会话
返回s.QueryOver()
.Fetch(p=>p.C.)。渴望
.List();
}

另一种方法是更改HBM文件,以指示默认情况下急切地加载子文件。这样您就不需要更改查询。

您可以像这样急切地加载此查询的子项(使用QueryOver语法)

public IList FindAllParentsWithChildren()
{
ISession s=//获取会话
返回s.QueryOver()
.Fetch(p=>p.C.)。渴望
.List();
}

另一种方法是更改HBM文件,以指示默认情况下急切地加载子文件。那么您就不需要修改查询了。

我怎么能不考虑这个问题:这实际上是个坏主意。使用缓存、批处理和临时连接抓取更好(参见Carl的回答)。我怎么能不这样想呢:这实际上是个坏主意。使用缓存、批处理和临时连接抓取更好(参见Carl的答案)
public IList<Parent> FindAllParentsWithChildren()
{
  ISession s = // Get session
  return s.QueryOver<Parent>()
    .Fetch(p => p.C).Eager
    .List<Parent>();
}