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