私は次のことをしようとしています:
var query =
(from a in session.Query<A>()
where a.BasicSearch(searchString) == true
select a);
しかし、この例外「System.NotSupportedException」が引き続き発生します。
これを解決する方法はありますか?
私は次のことをしようとしています:
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
ただし、ここで説明する手法を使用して、このような述語を別の方法で再利用できます。(ただし、これが 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);
}
使用法:
from a in Session.Query<A>().Where(A.BasicSearch(criteria))
更新: どうやら NHibernate に問題があるようです。動作するはずのバージョンについては、このブログ投稿を参照してください。
独自のSQL関数を呼び出すことは可能ですが、NHibernateがC#をSQLに変換する方法を認識できるように、それらのラッパーを作成する必要があります。
NEWID()
これは、SQLServerの関数にアクセスするための拡張メソッドを作成する例です。同じ手法を使用して、組み込みまたはユーザー定義のデータベースサーバー上の他の機能にアクセスします。
NHibernate LINQ を拡張するいくつかの例:
http://fabiomaulo.blogspot.se/2010/07/nhibernate-linq-provider-extension.html