17

LINQ を使用したプロジェクトがあり、独自のメソッドを使用したいと考えています。この NoWhiteSpaces メソッドは、スペースを含まない上位の文字列を返す必要があります。

public static class LittleExtensions
{
    public static string NoWhiteSpaces(this String s)
    {
        return Regex.Replace(s, @"\s", string.Empty).ToUpper();
    }
}

このメソッドを LINQ で使用する場合は、次のようになります。

static void GetHaendler()
    {
        using (var riaService = new gkmRia())
        {
            var hladany = "someone";
            var haendlers = from hndlr in riaService.GetGkmHaendlerOutlet()
                            where hndlr.NameOutlet.NoWhiteSpaces() == hladany.NoWhiteSpaces()
                            select hndlr;
            Console.Write(haendlers.First().NameOutlet);
        }
    }

次のエラー メッセージが表示されます。

LINQ to Entities はメソッド 'System.String NoWhiteSpaces(System.String)' メソッドを認識せず、このメソッドはストア式に変換できません。

解決策はありますか?お時間をいただきありがとうございます。

4

2 に答える 2

15

LINQ to Entities では式を SQL ステートメントに変換できる必要があるため、LINQ to Entities でカスタム メソッドまたはプロパティを使用することはできませんが、これはユーザーのメソッドでは実行できません。

回避する方法は、LINQ to Entities をバイパスし、代わりに を使用して LINQ to Objects を使用Enumerableすることです(以下のコードの にQueryable注意してください)。AsEnumerable()

static void GetHaendler()
{
    using (var riaService = new gkmRia())
    {
        var hladany = "someone";
        var haendlers = from hndlr in riaService.GetGkmHaendlerOutlet().AsEnumerable()
                        where hndlr.NameOutlet.NoWhiteSpaces() == hladany.NoWhiteSpaces()
                        select hndlr;
        Console.Write(haendlers.First().NameOutlet);
    }
}

これにより、データベースではなくアプリケーションでクエリが実行されるため、パフォーマンスに影響する可能性があることに注意してください。可能であれば、クエリを変更して、 Entity Framework でサポートされているメソッドを使用して表現できるようにすることをお勧めします。

LINQ to Entities でサポートされている別の式は次のようになります。

var hladany = "someone".NoWhiteSpaces();
var haenflers = from hndlr in riaService.GetGkmHaendlerOutlet().
                where hndlr.NameOutlet.Replace(" ", "").Replace("\t", "") == hladany
                select hndlr;

この例では、スペースとタブのみを処理します (正規表現はさまざまな空白文字も処理します) が、正確な要件がわからないため、それで十分な場合があります。Replace追加の置換を行うために、いつでもより多くの呼び出しを連鎖させることができます。

于 2013-06-19T09:24:12.647 に答える
6

LINQ to Entities は、呼び出されたすべてのメソッドを、実行されるデータベース クエリの一部に変換しようとします。メソッドを変換しようとすると、SQL で表現する方法がわからないため失敗します。

どちらかで回避できます

  • クエリを実行し、結果を具体化した後にフィルター処理する(大規模なデータセットを処理している場合は悪い考えですが)、または
  • サポートされている方法のみを使用してください (IMO の方が適切です)。サポートされているメソッドのリストは次のとおりです。
    CLR メソッドから正規関数へのマッピング
    メソッドString.Replace()String.ToUpper()がサポートされているため、カスタム メソッドを簡単に置き換えることができます。
于 2013-06-19T09:25:05.510 に答える