0

我在 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(首选扩展)来完成,因为应用程序使用的插件必须不知道 NHibernate 的存在。该插件接收一个 IQueryable 实例来进行查询(这允许我们轻松地将核心应用程序移植到其他数据库模式,例如 NoSQL 或其他东西,甚至无需重新编译插件或应用程序的其他部分)。

提前感谢您的帮助。

4

1 回答 1

0

默认情况下HasMany,FluentNHibernate 会延迟加载集合。您可以使用流利的语法进行配置。

延迟加载示例:

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

无论如何,这个配置主题非常复杂,取决于您如何配置映射。我建议您查看 hHibernate SQL 日志,log4net 以查看 SQL 命令是由 ORM 生成的

于 2012-07-18T08:16:03.600 回答