3

私は次のことをしようとしています:

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

しかし、この例外「System.NotSupportedException」が引き続き発生します。

これを解決する方法はありますか?

4

4 に答える 4

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); 
}

使用法:

from a in Session.Query<A>().Where(A.BasicSearch(criteria))

更新: どうやら NHibernate に問題があるようです。動作するはずのバージョンについては、このブログ投稿を参照してください。

于 2012-12-03T08:28:36.703 に答える
1

独自のSQL関数を呼び出すことは可能ですが、NHibernateがC#をSQLに変換する方法を認識できるように、それらのラッパーを作成する必要があります。

NEWID()これは、SQLServerの関数にアクセスするための拡張メソッドを作成する例です。同じ手法を使用して、組み込みまたはユーザー定義のデータベースサーバー上の他の機能にアクセスします。

于 2012-12-03T09:45:11.230 に答える
1

NHibernate LINQ を拡張するいくつかの例:

http://fabiomaulo.blogspot.se/2010/07/nhibernate-linq-provider-extension.html

https://nhibernate.jira.com/browse/NH-3301

于 2012-12-03T18:03:21.747 に答える