我将此条款映射到NHibernate 3.2上,并使用FluentNHibernate 1.3:
public class ClassA
{
public virtual Int32 Id{ get; }
....
public ICollection<ClassB> ClassesB { get; }
public ICollection<ClassC> ClassesC { get; }
}
public class ClassB
{
public virtual Int32 Id{ get; }
....
public ICollection<ClassA> ClassesA { get; }
public ICollection<ClassC> ClassesC { get; }
}
public class ClassC
{
public virtual Int32 Id{ get; }
....
public ICollection<ClassA> ClassesA { get; }
public ICollection<ClassB> ClassesB { get; }
}
所有映射都可以正常工作。但我需要使用LINQ进行查询,例如返回给定ClassB或ClassA实例中的所有ClassC实例,反之亦然。我需要在获取ClassC列表之前不加载任何ClassB或ClassA实例,只需使用实例的ID进行查询。
我知道我可以加载,例如,一个ClassB实例,然后获取ClassesC集合,但是我的应用程序设计我必须这样做而不这样做,我将使用它来做网格上的分页,以及其他操作与分页不同。
在纯SQL上,我可以通过简单的连接查询来实现,但我不知道如何使用LINQ。我不想要HQL或ICriteria的选项,它必须使用LINQ(Extensions更好),因为应用程序使用的插件必须没有NHibernate存在的意识。该插件接收一个IQueryable实例来进行查询(这允许我们轻松地将核心应用程序移植到其他数据库模式,如NoSQL或其他东西,甚至不重新编译插件或应用程序的其他部分。)
提前感谢您的帮助。
答案 0 :(得分:0)
默认情况下,FluentNHibernate中的HasMany
将加载lazy集合。您可以使用流畅的语法配置它。
延迟加载示例:
class ClassAMap : ClassMap<ClassA>
{
public ClassAMap()
{
// ...
// lazy loading using select
HasMany(x => x.ClassesB)
.LazyLoad()
.Fetch.Select()
// ...
}
或使用join
贪心加载:
class ClassAMap : ClassMap<ClassA>
{
public ClassAMap()
{
// ...
// greedy loading using join
HasMany(x => x.ClassesB)
.Fetch.Join()
// ...
}
Table.Is(x => x.EntityType.Name + "Table")
DefaultLazy.Always()
无论如何,这个配置主题非常复杂,取决于您如何配置映射。 我建议您使用log4net
查看hHibernate SQL日志,以查看ORM生成的SQL命令。