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