为什么Nhibernate.Linq会"The method Compareto is not implemented"给我抛出异常?



我已经为这个问题挣扎了很长时间,我不能让它正常工作。我想做的是,获取日期早于指定条目的条目。为了便于理解,我将向您展示以下代码片段:

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

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

有人有什么想法吗?

TIA

问题是NHibernate linq提供程序需要将对DateTime.Compare的调用转换为SQL,以便它可以在服务器上执行。正如错误所示,这尚未实现,尽管您可以将查询更改为:

_session.Linq<PostModel>()
            .Where(o => post.PostDate >= o.PostDate)
            .ToList();

可能会实现

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

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

我想把你的版本转换成SQL,我看不出他们是怎么知道的,即使有NHibernate所有的黑魔法。

李说得很对。NHibernate LINQ提供程序没有办法将方法调用转换为SQL,这就是抛出NotImplementedException的原因。你可以为NHibernate提供一种方法,通过NHibernate的LINQ提供商扩展模型把这个调用转换成SQL:

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

相关内容

  • 没有找到相关文章