1

看看下面的类:

public class Produt
{
    public virtual int id { get; set; }
    public virtual string name { get; set; }

    [ScriptIgnore]
    public virtual Unit unit { get; set; }
}

public class Unit
{
    public virtual int id { get; set; }
    public virtual string name { get; set; }
    public virtual IList<Produt> produts { get; set; }
}

在此之后,映射:

public partial class ProdutMap : ClassMap<Produt>
{
    public ProdutMap()
    {
        Id(x => x.id).GeneratedBy.Identity();
        Map(x => x.name).Length(100).Not.Nullable();
        References(x => x.unit, "idUnit").Cascade.All().LazyLoad();
    }
}

public partial class UnitMap : ClassMap<Unit>
{
    public UnitMap()
    {
        Id(x => x.id).GeneratedBy.Identity();
        Map(x => x.name).Length(100).Not.Nullable();
        HasMany(x => x.produts).Cascade.All().KeyColumns.Add("idUnit").LazyLoad();
    }
}

现在,假设我想执行这个查询:

SELECT produt.id, produt.name, unit.name FROM Produt, Unit WHERE produt.idUnit = unit.id

与休眠?怎么做?有什么帮助吗?

PS [ScriptIgnore] 是因为我在循环引用方面遇到了问题。我的课不只是这些。这只是一个例子。

4

1 回答 1

0

只需获取产品

最简单的方法是获取产品列表。Product 已经包含您需要的所有信息,因为它引用了 Unit。

// NOTE: This fetches ALL products.  You really should limit this.
var products = session.Query<Product>();
foreach (var product in products)
    Console.WriteLine("Product: {0}, Unit: {1}", product.Name, product.Unit.Name);

在此循环的每次迭代中,如果product.Unit指向 NHibernate 尚未获取的单元,NHibernate 将延迟执行另一个查询以获取该单元。

有时你不能使用延迟加载——也许你需要在迭代结果之前关闭 NHibernate 会话。此外,为了提高性能,最好减少到数据库的往返次数。我们可以通过改变我们的查询来解决这些问题,如下所示:

var products = session.Query<Product>().Fetch(x => x.Unit);

展平你的结果

如果由于某种原因您需要展平的结果对象,而不必挖掘嵌套对象来获取所需的数据,则可以使用“投影”来执行此操作。使用 LINQ,这看起来像:

var productInfos = session.Query<Product>().Select(x => new
{
    ProductId = x.Id,
    ProductName = x.Name,
    UnitName = x.Unit.Name
});

如果您需要限制 NHibernate 返回的列,这也很有用 - 例如,如果其中一列包含您想要避免获取的巨大 BLOB。

除了 LINQ,NHibernate 有几种不同的方式来执行查询:原生 SQL、HQL、Criteria 和 QueryOver。对于 Criteria 或 QueryOver,AliasToBean 结果转换器将在执行这些类型的查询时为您提供帮助。有关在 Criteria 查询中使用 AliasToBean 的示例,请参阅此相关问题:NHibernate - 仅在使用 Critera 查询时检索特定列?

于 2013-09-10T20:01:01.250 回答