我一直在努力解决这个问题而且我无法让它正常工作。我想要做的是获得日期早于指定条目的条目。为了便于您理解,我将向您展示此代码段:
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
答案 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)
http://fabiomaulo.blogspot.com/2010/07/nhibernate-linq-provider-extension.html