2009-05-24 9 views
1

Linqを使ってNHibernateにオブジェクトをロードし、熱心に子コレクションをロードする際に問題があります。オブジェクトは、次のようになります。私は、特定のIDと注文をロードしようとしていると(熱心に)それがすべてのLINQを使用して、子注文ラインだ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;} 
} 

。私のクエリは次のようになります。

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プロパティは、1つのオブジェクトのみが含まれています - データベースは間違い3.奇妙な話があり、私は復帰前order周りのforeachを行う場合、私は入手できますか3つの子アイテムすべて - しかし、これはデータベースを2回ヒットします。

代わりにSingle()を使用するようにクエリを変更しようとしましたが、どちらも機能しません。

私はlinqで何か問題がありますか?または、Expandの私の使用は間違っていますか?

ありがとうございます。
Simon。

注:FluentNHibernate Automappingを使用してNHマッピングを作成しています。データベースはSqliteデータベース(メモリにはないファイル)です。

答えて

2

この機能にバグがあるようです:

FirstOrDefault() breaks FetchType=join with Linq to NHibernate

は、TOP 1句を持っている場合、これは問題になる可能性があり、生成されたデータベースクエリを見てみましょう。

NHibernateへのLinqはまだ準備ができていないので、この種のバグが発生する可能性があることに注意してください。

+1

ありがとう、私はこれがバグかもしれないと思ったが、私は正しいLinqメソッドを使用していたことを確認したい。 NHProfを使うと、クエリに 'limit 1'節(' top 1'と同じsqlite)があることがわかります。 コードを次のように変更しました。 return order.ToList()[0]; これは期待どおりに動作します。 ありがとうございます。 – Simon

関連する問題