NHibernate 克服 NotSupportedException
Posted
技术标签:
【中文标题】NHibernate 克服 NotSupportedException【英文标题】:NHibernate Overcoming NotSupportedException 【发布时间】:2012-06-18 09:12:44 【问题描述】:有谁知道克服 NotSupportedException 的任何方法?我有一个针对用户的方法:
public virtual bool IsAbove(User otherUser)
return HeirarchyString.StartsWith(otherUser.HeirarchyString);
而我想做:
_session.Query<User>.Where(x => loggedInUser.IsAbove(x));
但这会引发 NotSupportedException。真正的痛苦是使用
_session.Query<User>.Where(x => loggedInUser.HeirarchyString.StartsWith(x.HeirarchyString));
工作得很好。但是,我不喜欢将其作为解决方案,因为这意味着如果我更改 IsAbove 方法的工作方式,我必须记住在我想要更新代码时复制代码的所有地方
【问题讨论】:
啊废话,当人们也不会拼写时,我总是第一个指出!多年来一定是弄错了:$ 【参考方案1】:命名规范表达式并重复使用,例如:
public Expression<Func<....>> IsAboveSpecification = (...) => ...;
public virtual bool IsAbove(User otherUser)
return IsAboveSpecification(HeirarchyString, otherUser.HeirarchyString);
根据需要在查询中重用 IsAboveSpecification。如果经常使用 IsAbove() 方法,可以在表达式上缓存 Compile() 方法的结果。
【讨论】:
我遇到了和 OP 一样的问题。无法使此解决方案起作用。首先,我希望能够调用对象,所以我不得不将初始化移到构造函数中,因为this
在成员初始化程序中不可用。更糟糕的是,我在尝试调用规范表达式时遇到错误:“预期的方法、委托或事件”。有什么建议吗?
尝试在表达式上调用 .Compile().Invoke()。它现在可以编译,但在从查询中调用函数“IsAbove”时会出现相同的异常。
无法从查询中调用表达式有几个原因:首先,当它被标记为公共时,NH 抱怨字段必须是受保护的或私有的。其次,当我尝试从外部查询调用它时,我得到了与上面相同的“方法、委托或事件预期”编译器错误。
您应该提出一个新问题并发布您尝试使用的代码。我不认为 NH 会抱怨某些事情是公开的 - 它确实坚持认为 virtual
修饰符存在。
感谢您的建议。目前有点继续前进,但我相信我们会回到这一点。当这再次变得相关时,我会问一个新问题(它会!)。以上是关于NHibernate 克服 NotSupportedException的主要内容,如果未能解决你的问题,请参考以下文章
Nhibernate学习教程-- 第一个NHibernate程序
NHibernate 2 + NHibernate.JetDriver + MS Access:如何访问表的“附件”字段