LINQ to Nhibernate用户定义的where子句中的函数

Rub*_*uba 3 c# linq nhibernate

我正在尝试执行以下操作:

var query =
    (from a in session.Query<A>()
    where a.BasicSearch(searchString) == true
    select a);
Run Code Online (Sandbox Code Playgroud)

但它一直给我这个异常"System.NotSupportedException"!

不知道怎么解决这个问题?

jer*_*enh 7

在LINQ查询中不可能使用用户定义的函数.NHibernate linq提供程序不知道如何将函数转换为SQL.

LINQ to NHibernate通过检查您在运行时提供的LINQ表达式,并将它在此表达式树中找到的内容转换为常规SQL表达式来工作.这是一篇很好的文章,可以获得表达树的一些背景知识:http://blogs.msdn.com/b/charlie/archive/2008/01/31/expression-tree-basics.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); 
}
Run Code Online (Sandbox Code Playgroud)

用法:

from a in Session.Query<A>().Where(A.BasicSearch(criteria))
Run Code Online (Sandbox Code Playgroud)

更新:显然NHibernate会出现问题.请参阅此博客文章,了解应该运行的版本.