使用Linq在NHibernate中检索对象和子集合

时间:2009-05-24 13:23:09

标签: c# linq nhibernate linq-to-nhibernate

我在使用Linq到NHibernate加载对象并急切加载子集合时遇到问题。对象看起来像这样:

public class Order
{
    public Guid Id {get; set; }
    public IList<OrderLine> OrderLines {get;set;}
}
public class OrderLine
{
    public Guid Id {get;set;}
    public string Item {get;set;}
}

我正在尝试使用Linq加载具有特定ID的订单并且(急切地)加载它的所有子订单。我的查询如下:

using (var s = _sessionFactory.OpenSession())
using (var tx = s.BeginTransaction())
{
    var order = from o in s.Linq<Order>().Expand("OrderLines")
                where o.Id == id
                select o;
    return order.First();
}

但是,当我显示订单时,OrderLines属性只包含一个对象 - 数据库肯定有3.奇怪的是,如果我在返回之前在order附近做了一个foreach,我会得到所有3子项目 - 但这会两次击中数据库。

我尝试修改查询以使用Single()代替,但这也不起作用。

我是否对linq做错了什么?或者我使用Expand是否错误?

提前致谢,
西蒙。

注意:我正在使用FluentNHibernate Automapping来创建我的NH Mapping,而我的数据库是一个Sqlite数据库(一个文件,不在内存中)。

1 个答案:

答案 0 :(得分:2)

这个功能似乎有一个错误:

FirstOrDefault() breaks FetchType=join with Linq to NHibernate

看看生成的数据库查询,如果它有TOP 1子句,这可能是问题。

请记住,Linq对NHibernate还远未准备好生产,因此可能会出现这种错误。