2011-01-12 2 views
2

Ich versuche, Nhibernate zu verwenden, um Daten von MySQL Db abzurufen. Allerdings brauche ich für die Projektion einige Berechnungen. Nhibernate scheint das nicht zu mögen. Es funktioniert gut mit LINQ zu SQL.Nhibernate Komplex Projektionsausdruck

 var purchases = _session.QueryOver<Purchase>() 
         .Where(validPID<Purchase>(portfolioID)) 
         .SelectList(list => list 
          .SelectGroup(c => c.currency)         
          .SelectSum(c => c.shares * c.price - c.commission)) 

ich "bestimmen kann nicht Mitglied von ((c.shares * c.price) - c.commission)" als Fehler.

Wie kann ich das schreiben, um zu arbeiten?

Dank

+0

ich bin die Abfrage innerhalb select sum zu erraten ist falsch. Können Sie das hier versuchen (c.shares * c.price) - c.commission. Ich denke nicht, dass es funktioniert, weil Linq * und - nicht ausstehen kann und sie zu einer SQL-Abfrage übersetzt – Baz1nga

Antwort

0

Welche Bibliothek von Linq-Erweiterungen verwenden Sie die Select, und SelectSum select hat? Sie sind nicht die Standardmethoden für diese Operationen, und sie sind keine NH-Erweiterungen. Daher hat NHibernate wahrscheinlich keine Ahnung, was er mit ihnen machen soll. In der Regel können Sie beim Erstellen einer Linq2NH-Abfrage keine benutzerdefinierten Erweiterungsmethoden verwenden. Wenn es nicht aus System.Linq oder NHibernate.Linq stammt, können Sie es nicht verwenden (eine der wenigen Ausnahmen ist IEnumerable.Contains(), die in eine IN-Abfrage übersetzt) ​​

Versuchen Sie, ein AsEnumerable () rufe nach der Where-Methode auf. Dies erzwingt im Grunde die Auswertung der abfragbaren Ausdrucksbaumstruktur, und alle weiteren Operationen werden im Speicher für die Objekte (oder ihre NH-Proxys, die nach Bedarf gefüllt werden) ausgeführt.

+0

Hallo, das ist ein Standard in NH 3.0. Es ist keine linq zur Verfügung gestellt. Ich würde wirklich gerne alle Berechnungen in der Datenbank durchführen, wenn möglich. – Leon

0

Warum verwenden Sie nicht stattdessen HQL. Ich bin nicht sicher, wie man Ihre Frage in HQl übersetzt, weil ich Kopf oder Endstück davon nicht machen kann, aber Ihre artichematic Betriebe werden in HQL unterstützt.

Wenn Sie erklären können, was Sie tun, ich cou; d wahrscheinlich helfen Sie bei der Abfrage.

0

I ended actaully in Code Summieren up wie diese

 var purchases = (from p in _session.QueryOver<Purchase>() 
            .Where(validPID<Purchase>(portfolioID)).List().ToList() 
         group p by p.currency into currencies 
         select new object[2] { 
          currencies.Key, 
          currencies.Sum(f => -1*f.price*f.shares - f.commission) 
         }).ToList();