为什么Nhibernate.Linq会抛出异常“方法Compareto未实现”?

时间:2011-04-09 14:05:06

标签: c# asp.net linq nhibernate linq-to-sql

我一直在努力解决这个问题而且我无法让它正常工作。我想要做的是获得日期早于指定条目的条目。为了便于您理解,我将向您展示此代码段:

        var post = _session.Linq<PostModel>()
            .Where(o => o.PostId == id)
            .FirstOrDefault();

        return _session.Linq<PostModel>()
            .Where(o => DateTime.Compare(post.PostDate, o.PostDate) >= 0)
            .ToList();

这不起作用!它会让我异常说:

The method Compareto is not implemented.

我已经尝试将“IComparer”实现到我的PostModel,但这似乎不是问题。虽然,如果我首先将所有条目转换为列表,然后比较它们,这将起作用,如下所示:

        return _session.Linq<PostModel>().ToList()
            .Where(o => DateTime.Compare(post.PostDate, o.PostDate) >= 0)
            .ToList()

但据我了解,在任何情况下将所有条目转换为列表将导致NHibernate选择所有条目。如果我们谈论少量条目,这可能不是问题,但从长远来看,这将浪费一些时间。

有没有人有任何想法?

TIA

3 个答案:

答案 0 :(得分:3)

问题是NHibernate linq提供程序需要将对DateTime.Compare的调用转换为SQL,以便可以在服务器上执行。正如错误所述,虽然您可以将查询更改为:

,但尚未实现
_session.Linq<PostModel>()
            .Where(o => post.PostDate >= o.PostDate)
            .ToList();

可能会实施。

答案 1 :(得分:2)

只是一个猜测,但它可能不喜欢你的原因所在的静态调用。也许只是尝试在datetime上使用内置的关系运算符,如下所示:

.Where(o => o.PostDate >= post.PostDate)

我想尝试将你的版本转换为SQL,我无法看到他们知道如何做到这一点,即使NHibernate所做的所有黑魔法也是如此。

答案 2 :(得分:2)

李开始砰的一声。 NHibernate LINQ提供程序无法将方法调用转换为SQL,这就是抛出NotImplementedException的原因。您可以通过NHibernate的LINQ提供程序扩展模型为NHibernate提供一种将此调用转换为SQL的方法:

http://fabiomaulo.blogspot.com/2010/07/nhibernate-linq-provider-extension.html