我试图使用nhibernate从mysql db中检索数据。但是我需要投影来运行一些计算。 Nhibernate似乎并不喜欢这样。它适用于linq to sql。
var purchases = _session.QueryOver<Purchase>()
.Where(validPID<Purchase>(portfolioID))
.SelectList(list => list
.SelectGroup(c => c.currency)
.SelectSum(c => c.shares * c.price - c.commission))
我得到&#34;无法确定((c.shares * c.price) - c.commission)&#34;作为错误。
我该如何写这个呢?
由于
答案 0 :(得分:0)
您使用的Linq扩展库包含SelectList,SelectGroup和SelectSum?它们不是这些操作的标准方法,它们不是NH提供的扩展。因此,NHibernate可能不知道如何处理它们。通常,在构造Linq2NH查询时,不能使用任何自定义扩展方法;如果它不是来自System.Linq或NHibernate.Linq,则不能使用它(IEnumerable.Contains()转换为IN查询的极少数例外之一)
尝试在Where方法之后插入AsEnumerable()调用。这将基本上强制评估Queryable表达式树,并且所有进一步的操作将在对象(或其NH代理,在必要时填充)的内存中执行。
答案 1 :(得分:0)
为什么不使用HQL。我不确定如何将您的查询转换为HQl,因为我无法做出它的头部或尾部,但您的艺术操作将在HQL中得到支持。
如果你可以解释你在做什么,我可以帮你解决问题。
答案 2 :(得分:0)
我实际上最终总结了像这样的代码
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();