【问题标题】:NHibernate Overcoming NotSupportedExceptionNHibernate 克服 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 方法的工作方式,我必须记住在我想要更新代码时复制代码的所有地方

【问题讨论】:

  • 啊废话,当人们也不会拼写时,我总是第一个指出!多年来一定是弄错了:$

标签: linq nhibernate notsupportedexception


【解决方案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 抱怨字段必须是受保护的或私有的。其次,当我尝试从外部查询调用它时,我得到了与上面相同的“方法、委托或事件预期”编译器错误。
  • 您应该提出一个新问题并发布您尝试使用的代码。我不认为 N​​H 会抱怨某些事情是公开的 - 它确实坚持认为 virtual 修饰符存在。
  • 感谢您的建议。目前有点继续前进,但我相信我们会回到这一点。当这再次变得相关时,我会问一个新问题(它会!)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多