2

これは私のlinqクエリです(Linq to Sql):

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 への変換はサポートされていません。

どこが間違っていますか?どうすれば修正できますか?

4

3 に答える 3

4

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

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

これにより、最初にtoListを介してページがメモリに取り込まれ、そこでprovaメソッドが評価されます。

于 2012-04-15T12:02:55.867 に答える
3

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

問題にアプローチする別の方法

  • ストアド プロシージャを使用し、linq でのストアド プロシージャの使用について読む
  • SQL からメモリにデータを取得し、関数に基づいてフィルター処理します。ここでの明らかに不利な点は、必要以上に多くの行をデータベースから取得することです。

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

    あなたが望むものです。

余談ですが、あなたのメソッドprovaは文字列を返すだけではなく、関数がまったく役に立たないので、関数を削除した方がよいと思います。iまた、常にクエリを使用して回避できるカウンターを使用している配列のデータベースcosに複数のクエリを発行していると思います。クエリINの要素数の制限を覚えておいてINください。

于 2012-04-15T11:58:43.003 に答える
1

のように実行するだけでなくlinq to sqlExpression treeget parsed to SQL クエリを使用しますlinq to objects

ORM プロバイダーは、メソッドを SQL に変換する方法を知りません。

linq to SQL LINQクエリでメソッドを使用しないでください。

于 2012-04-15T11:59:06.127 に答える