2010-02-25 6 views
1

Version courte Cette requête fonctionne dans la base de données mais échoue avec Linq To NHibernate. Pourquoi?NHibernate Sous-requête Linq - Comment sélectionner les groupes qui contiennent un certain élément par ID

var items = (from g in db.Find<DataGroupInfo>() 
       where (from d in g.data where d.Id == dataID select d).Count() > 0 
       select g).ToList(); 

détaillée Version longue

J'ai deux objets mis en correspondance par NHibernate Automapper avec une relation ManyToMany.

return Fluently.Configure() 
    //a few other settings here... 
    //relevant settings below 
       .Override<DataGroupInfo>(map => 
       { 
        map.HasManyToMany(d => d.data); 
       } 
       .Conventions.Add(DefaultCascade.All()) 
       .Conventions.Add(DefaultLazy.Never()) 


public class DataInfo 
{ 
    public virtual int Id { get; private set; } 
    public virtual DateTime created { get; set; } 
    public virtual string label { get; set; } 
    public virtual string description { get; set; } 
} 

public class DataGroupInfo 
{ 
    public virtual Int32 Id { get; set; } 

    public virtual DateTime created { get; set; } 
    public virtual string label { get; set; } 
    public virtual string description { get; set; } 

    public virtual IList<DataInfo> data { get; set; } 
} 

Je veux récupérer tous les DataGroups qui contiennent un certain DataInfo.

Cette requête fonctionne dans l'admin SQLite donc je pense que ma base de données est correctement configuré:

select * from DataGroupInfo 
INNER JOIN DataInfoToDataGroupInfo ON 
DataGroupInfo.Id == DataInfoToDataGroupInfo.DataGroupInfo_id 
where 
DataInfoToDataGroupInfo.DataInfo_id == 3 

Je suis un dépôt qui expose Linq dans ces deux façons

public IQueryable<T> Find<T>() 
{ 
    return session.Linq<T>(); 
} 

public IQueryable<T> Find<T>(Expression<Func<T, bool>> predicate) 
{ 
    return Find<T>().Where(predicate); 
} 

J'utilise les dépôts comme Lorsque le Linq essaie d'exécuter ci-dessus, j'obtiens l'erreur suivante sous eith:

static public List<DataGroupInfo> GetAllWithData(Int32 dataID) 
    { 
     using (var db = new DBRepository()) 
     { 
      //var items = (from g in db.Find<DataGroupInfo>() 
      //    where (from d in g.data where d.Id == dataID select d).Count() > 0 
      //    select g).ToList(); 

      var items = db.Find<DataGroupInfo>(dg => dg.data.Where(d => d.Id == dataID).Count() > 0).ToList(); 

      return items; 
     } 
    } 
méthode er:

NHibernate.QueryException était non gérée par le code utilisateur
message = "ne pouvait pas résoudre la propriété: data.Id de: MapLarge.Public.Data.DataGroupInfo"
Source = "NHibernate" StackTrace: à NHibernate.Persister.Entity.AbstractPropertyMapping.GetColumns (String propertyName)

Qu'est-ce que je fais mal?

---- ----- Mise à jour

Ce travail donne autour du résultat attendu, mais son approche de la force brute tirant tous les DataGroup en mémoire, puis des objets de filtrage en utilisant C# plutôt que la base de données .. mais Au moins, cela réduit mon problème à un problème spécifique à NHibernate.

 var step1 = db.Find<DataGroupInfo>().ToList(); 
     var items = step1.Where(dg => dg.data.Where(d => d.Id == dataID).Count() > 0).ToList(); 

Je serais toujours l'amour vraiment une réponse si quelqu'un est là :-)

+1

A quoi ressemble votre table DataInfoToDataGroupInfo comme? J'ai rencontré des problèmes avec l'Automapper joignant many-to-many lorsque la table de liaison contient des colonnes autres que les deux clés étrangères. –

+0

DataInfoToDataGroupInfo a juste les deux clés étrangères, et la totalité de la base de données a été créée par Nhibernate AutoMapper donc je pense qu'elle devrait être solide si mes définitions de classe sont conformes aux conventions NHibernate Automapper. Voici ce que SQLite administration affiche pour les propriétés de la table lorsque je vérifie extérieurement: ColumnInfoToColumnGroupInfo ColumnGroupInfo_id ENTIER pas null ColumnInfo_id ENTIER pas null Voici le code autogène: var NewDB = new SchemaExport (config) .Create (true , vrai); – Glenn

+0

Je sais que Linq to NHibernate est assez récent, c'est peut-être un bug ou un type de requête non supporté? – Glenn

Répondre

2

LINQ to NHibernate ne prend pas en charge les sous-requêtes ou rejoint: http://ayende.com/Blog/archive/2009/07/26/nhibernate-linq-1.0-released.aspx

+0

Merci. Je pensais me souvenir d'une telle limitation, mais je ne savais pas si cette limite avait changé depuis l'été dernier. Bien quand cette fonctionnalité fonctionne. – Glenn

+0

Je sais qu'ils ont essayé de supporter tous les 101 échantillons de Linq. http://msdn.microsoft.com/en-us/vcsharp/aa336746.aspx Il serait cool si le blog de Ayende ou le wiki de NHibernate gardait une liste des échantillons Linq supportés et non supportés de la liste des 101 échantillons. Je pense qu'il a déjà des tests pour chacun intégré dans ses tests unitaires. – Glenn

Questions connexes