2009-05-24 7 views
1

J'ai un problème avec Linq à NHibernate pour charger un objet et charger avec impatience une collection enfant. Les objets ressemblent à ceci:Récupération d'un objet et d'une collection enfant dans NHibernate en utilisant Linq

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;} 
} 

Je suis en train de charger un ordre avec un identifiant spécifique et (avec impatience) l'ensemble de ses OrderLines enfants LINQ. Ma requête ressemble à ceci:

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

Cependant, lorsque je visualise l'ordre, la propriété OrderLines ne contient qu'un seul objet - la base de données a certainement 3. Bizarrement, si je fais un foreach autour order avant le retour je reçois tous les 3 éléments enfants - mais cela frappe deux fois la base de données.

J'ai essayé de modifier la requête pour utiliser Single() à la place, mais cela ne fonctionne pas non plus.

Est-ce que je fais quelque chose de mal avec linq? Ou est-ce que mon utilisation de Expand est incorrecte? Merci d'avance,
Simon.

Remarque: J'utilise FluentNHibernate Automapping pour créer ma NH Mapping, et ma base de données est une base de données Sqlite (un fichier, pas en mémoire).

Répondre

2

Il semble que cette fonctionnalité a un bug:

FirstOrDefault() breaks FetchType=join with Linq to NHibernate

Jetez un oeil à la requête de base de données générée, si elle a la clause TOP 1, cela peut être le problème. Rappelez-vous que Linq to NHibernate est encore loin d'être prêt pour la production, donc ce type de bogue peut survenir.

+1

Merci, je pensais que c'était peut-être un bug, mais je voulais vérifier que j'utilisais la bonne méthode Linq. En utilisant NHProf, je peux voir que la requête a une clause 'limit 1' (équivalent sqlite de' top 1'). J'ai changé mon code pour être: return order.ToList() [0]; et cela fonctionne comme prévu. Merci. – Simon

Questions connexes