2010-11-23 3 views
1

J'ai une requête linq utilisant nhibernate 3.0. Mais il continue de renvoyer une erreur. J'ai essayé la même chose dans LINQ 2 SQL et cela fonctionne parfaitement.LINQ to Nhibernate (3.0): GroupBy et Sum dans la sous-requête donne NoTImplemented

Tout corps a une idée de ce qui ne va pas ... Voici une partie de mon select, c'est une sous-requête avec un Groupby et SUm.

Amount = (System.Double) 
    ((from m0 in _session.Query<Statement>() 
    where m0.Code== c.Code 
    group m0 by new 
    { 
     m0.Code 
    } 
    into g 
    select new 
    { 
    Expr1 = (System.Double)g.Sum(p => p.Amount) 
    }).First().Expr1) 
    }; 

J'ai la dernière CSR1 installée de NHibernate, mais il ne semble pas travailler avec ma requête ..

des idées?

Merci à l'avance

Répondre

3

Le fournisseur LINQ en NH3 est actuellement dans un état bêta. Certaines constructions ne sont pas encore supportées. (L'équipe prévoit d'y remédier après la publication de NH3.) Les parties qui causent des problèmes dans votre requête sont le type anonyme "new {}" dans la clause group by et le first() dans le contexte d'un groupe par. Les deux ne sont pas actuellement mis en œuvre. La requête suivante exécute correctement et doit donner les mêmes résultats:

var query = from m0 in session.Query<Statement>() 
      where m0.Code == c.Code 
      group m0 by m0.Code into g 
      select new {Expr1 = g.Sum(p => p.Amount)}; 
var result = query.ToList().First().Expr1; 

Notons d'abord que la « nouvelle {} » dans le groupe par la clause n'est pas nécessaire. L'autre changement consistait à ajouter "ToList()". Cela force les résultats à être interrogés à partir de la base de données, puis nous utilisons LINQ-to-Objects pour obtenir le résultat First(). Le SQL généré pour cette requête est:

select cast(sum(statement0_.Amount) as DOUBLE PRECISION) as col_0_0_ 
from  Statement statement0_ 
where (statement0_.Code is null) 
     and ('FOO' /* @p0 */ is null) 
      or statement0_.Code = 'FOO' /* @p0 */ 
group by statement0_.Code 
+0

Merci James, mais je reçois une erreur de compilation ... "Impossible de convertir le type de source System.Linq.IQueryable pour cibler le type double" voici mon code - Rappelez-vous que Quantité fait partie d'une autre requête .. et que le montant est DOUBLE (sous-requête) Quantité = (à partir de m0 dans this._session.Query () où m0.ClientCode == c.ClientCode groupe m0 par m0.ClientCode en g sélectionnez nouveau {Expr1 = g.Sum (p => p.Amount)})}; – Martin

+0

J'apprécierais n'importe quels commentaires je pense que je suis presque là :-) – Martin

+0

Ne vous suit pas tout à fait. La requête ci-dessus est en fait une sous-requête qui fait partie d'une requête plus grande? Si oui, pouvez-vous montrer toute la requête afin que nous ayons du contexte? (N'hésitez pas à mettre à jour la question avec le nouveau code.Code de toute longueur significative dans les commentaires est difficile à lire.) –