2011-01-12 110 views
2

我试图用nhibernate从mysql数据库中检索数据。不过,我需要投影来运行一些计算。 Nhibernate似乎不喜欢那样。它与linq to sql很好。nhibernate复杂投影表达式

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

我得到“无法确定来自((c.shares * c.price) - c.commission)的成员”为错误。

我该怎么写这个工作?

感谢

您正在使用什么库LINQ的扩展具有的SelectList,SelectGroup和SelectSum
+0

我猜选择和内查询不正确。你可以在那里尝试这个(c.shares * c.price) - c.commission。我不认为它会工作,因为Linq不能保证*和 - 并将它们翻译成SQL查询 – Baz1nga 2011-01-13 03:58:22

回答

0

?它们不是这些操作的标准方法,它们不是NH提供的扩展。因此,NHibernate可能不知道如何处理它们。通常,在构建Linq2NH查询时,不能使用任何自定义扩展方法;如果它不是来自System.Linq或NHibernate.Linq,则不能使用它(其中一个例外是IEnumerable.Contains(),这意味着IN查询)

尝试插入一个AsEnumerable( )在Where方法后调用。这将基本上强制对Queryable表达式树进行评估,并且所有进一步的操作将在对象(或其NH代理,根据需要填充)在内存中执行。

+0

嗨,这是NH 3.0的一个标准。它不是提供的linq。如果可能,我真的很想在数据库中执行所有计算。 – Leon 2011-01-12 20:46:56

0

为什么不使用HQL代替。我不知道如何将你的查询翻译成HQ1,因为我无法制作它的头部或尾部,但是你的artihematic操作将在HQL中得到支持。

如果你能解释你在做什么,我可能会帮助你查询。

0

我actaully结束了在代码总结这样

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