2010-11-30 5 views
3

J'utilise Nhibernate v2.1.2.4000. Avec plusieurs à plusieurs entre les messages d'une balise J'ai la requête:Linq to NHibernate - commande de type anonyme

tags 
.Select(t => new { Name = t.Name, Count = t.Posts.Count }) 
.OrderBy(x => x.Count); 

de commande type anonyme échoue (référence non définie à une instance d'un objet). Cette question est-elle liée à LinqToNH? Quelle peut être la source de cette erreur? Quelle est la solution? Si c'est quelque chose lié à LinqToNH alors comment cela peut-il être résolu avec une autre option (par exemple l'API Criteria)?

EDIT: Lorsque je tente l'option ICriteria d'Adam, SQLProfiler dit script exécuté est:

SELECT this_.Name as y0_, count(this_.Id) as y1_ FROM Tag this_ GROUP BY this_.Name ORDER BY count(this_.Id) asc 

Mapping Tag:

public class TagMap : ClassMap<Tag> 
{ 
    public TagMap() 
    { 
     Table("Tag"); 
     Id(x => x.Id).GeneratedBy.GuidComb(); 
     Map(x => x.Name); 
     HasManyToMany(x => x.Posts) 
      .Table("PostTags") 
      .ChildKeyColumn("Post") 
      .ParentKeyColumn("Tag") 
      .Cascade.None().Inverse(); 
    } 
} 

Répondre

2

Il y a beaucoup de choses à NHibernate.Linq pour NHibernate 2.1.2.4000 ça ne marchera pas. Vous pouvez utiliser HQL ou ICriteria à la place, ou mettre à niveau vers NHibernate 3.0, ou si vous allez utiliser toutes les données, forcer votre requête Linq à s'exécuter après le Select en ajoutant un ToList. L'objet anonyme par lui-même est quelque chose que NHibernate.Linq peut certainement gérer. Par ailleurs, vous n'avez pas besoin de spécifier le nom du champ dans un objet anonyme si c'est le même que le champ/propriété que vous le faites glisser.

EDIT: Une version ICriteria de cette requête ressemblerait à ceci ...

var tags = session.CreateCriteria(typeof(Tag), "tag") 
    .SetProjection(
     Projections.GroupProperty("tag.Name"), 
     Projections.Count("tag.Posts")) 
    .AddOrder(Order.Asc(Projections.Count("tag.Posts"))) 
    .List(); 

EDIT: Avec une application propre, je reçois le même SQL, Arch. Ma cartographie précédente était erronée. Celui-ci semble fonctionner cependant.

var tags = session.CreateCriteria(typeof(Tag), "tag") 
    .CreateCriteria("tag.Posts", "post") 
    .SetProjection(
     Projections.GroupProperty("tag.Name"), 
     Projections.Count("post.Id")) 
    .AddOrder(Order.Asc(Projections.Count("post.Id"))) 
    .List(); 

Le SQL que je reçois est ce ...

SELECT this_.Name as y0_, count(post1_.Id) as y1_ FROM Tag this_ inner join Post_Tags posts3_ on this_.Id=posts3_.Tag inner join Post post1_ on posts3_.Post=post1_.Id GROUP BY this_.Name ORDER BY count(post1_.Id) asc 
+0

merci pour la réponse. la mise à niveau vers 3.0 n'est malheureusement pas une option pour le moment. comment peut-il être écrit avec l'API Criteria? J'ai également modifié la question pour l'option API Criteria. – rovsen

+0

Adam, quand j'essaie cette version d'ICriteria dans le nombre de résultats est toujours 1, bien que tous ne soient pas 1. Avez-vous une idée pourquoi cela se produit? – rovsen

+0

Pourriez-vous définir une relation un-à-plusieurs au lieu d'une relation plusieurs-à-plusieurs? Avez-vous accès à SQL Server Profiler? Essayez d'exécuter cela et de voir ce que vous obtenez SQL hors de l'appel. J'ai construit une application de démonstration pour tester mon ICriteria mais je n'y ai pas accès ici. –

1

Essayez de commander d'abord, puis en sélectionnant. J'ai des requêtes très similaires sur 2.1.2.4 qui fonctionnent parfaitement.

Edit: Essayez aussi la commutation entre Count et Count()

+0

merci pour la réponse. ça n'a pas marché pour moi. – rovsen

Questions connexes