2012-04-15 13 views
1

これは私のLINQクエリ(LINQ to SQLは)次のとおりです。なぜlinqクエリ内で関数を呼び出せないのですか?

pagina = (from Pagine page in kDataBase.Pagines 
      where prova(page.title_it) == urlSuddivisa[i].ToLower() 
      select page).FirstOrDefault(); 

、これは私が(同じクラス内)を呼び出す関数です。

private string prova(string example) 
{ 
    return example; 
}    

それは言う:

メソッド 'System.String prova(System.String)'のsqlへの変換はサポートされていません。私は間違っ

?それをどうやって修正することができますか?

答えて

3

linqクエリは、dBに対して実行されるSQLクエリに変換されるため、カスタム関数をSQLクエリに変換することはできません。問題

  • ストアド・プロシージャを使用してメモリにSQLからデータを取得し、あなたの関数に基づいて、それをフィルタリング

  • LINQでストアドプロシージャを使用する方法についてを読んをappraoachingの

    代替の方法。明らかに、ここでの欠点は、あなたが

    var paginas=(from Pagine page in kDataBase.Pagines).ToList().Where(p =>prova(p.title_it) == urlSuddivisa[i].ToLower()).FirstOrDefault();

    必要とされるものよりも、データベースからの行の多くの多くの数を取得しますです、あなたが望むものです。サイドノートでは

私は単なる文字列それ以外の機能は完全に無用であるとあなたが同様の機能を取り除くことを返すだけではありませんprovaあなたの方法を推測しています。また、私はあなたがカウンターで使用している配列のデータベースcosに複数のクエリを発射していると確信していますINクエリを使用して常にそれを回避し、INクエリの要素の数の制限を覚えています。

1

linq to sqlExpression treeは、linq to objectsのように実行するのではなく、SQLクエリに解析されます。

あなたのORMプロバイダは、メソッドをSQLに変換するのに熱心ではありません。

あなたはlinq to SQLLINQクエリ内のメソッドを使用しないでください。

3

あなたのLINQのクエリ式は、実行時にSQLに変換され、フレームワークは、適切なSQLにPROVAのメソッド呼び出しに変換する方法を知りません。代わりに、あなたはこのような何かを行うことができます。

pagina = (from Pagine page in kDataBase.Pagines select page).ToList().Where(p => prova(p.title_it) == urlSuddivisa[i].ToLower()).FirstOrDefault(); 

これは最初のPROVAの方法は、その後に評価することができToListメソッドを介してメモリにページを引っ張ってきます。

関連する問題