nhibernate复杂投影表达式

时间:2011-01-12 20:33:16

标签: .net nhibernate

我试图使用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;作为错误。

我该如何写这个呢?

由于

3 个答案:

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