我正在尝试执行以下操作:
var query =
(from a in session.Query<A>()
where a.BasicSearch(searchString) == true
select a);
但它一直给我这个异常“System.NotSupportedException”!
知道如何解决这个问题吗?
无法在 LINQ 查询中使用用户定义的函数。 NHibernate linq 提供程序不“知道”如何将您的函数转换为 SQL。
LINQ to NHibernate 的工作原理是检查您在运行时提供的 LINQ 表达式,并将在此表达式树中找到的内容转换为常规 SQL 表达式。这是一篇很好的文章,可以了解表达式树的一些背景知识:http://blogs.msdn.com/b/charlie/archive/2008/01/31/expression-tree-basics.aspx http://blogs.msdn.com/b/charlie/archive/2008/01/31/expression-tree-basics.aspx
但是,您可以以另一种方式重用这样的谓词,使用这里讨论的技术 http://www.albahari.com/nutshell/predicatebuilder.aspx。 (不过我不确定这是否适用于 NHibernate。)如果它有效,它看起来会像这样:
// this could be a static method on class A
public static Expression<Func<A, bool>> BasicSearch(string criteria)
{
// this is just an example, of course
// NHibernate Linq will translate this to something like
// 'WHERE a.MyProperty LIKE '%@criteria%'
return a => criteria.Contains(a.MyProperty);
}
Usage:
from a in Session.Query<A>().Where(A.BasicSearch(criteria))
更新:显然 NHibernate 会出现问题。看这篇博文提供了一个应该可以工作的版本 http://petemontgomery.wordpress.com/2011/02/10/a-universal-predicatebuilder/.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)