129

linqクエリを実行しようとすると、次のエラーが発生します。

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

人々が同じエラーを受け取る以前の質問をたくさん読みました。これを正しく理解しているのは、LINQ to Entitiesではlinqクエリ式全体をサーバークエリに変換する必要があるため、外部メソッドを呼び出すことができないためです。初期化。私は自分のシナリオをまだうまくいくものに変換することができず、私の脳は溶け始めているので、誰かが私を正しい方向に向けてくれることを望んでいました。私たちはEntityFrameworkと仕様パターンを使用しています(そして私は両方に不慣れです)。

仕様を使用するコードは次のとおりです。

ISpecification<Charity> specification = new CharitySearchSpecification(charityTitle, charityReference);

charities = charitiesRepository.Find(specification).OrderBy(p => p.RegisteredName).ToList();

linq式は次のとおりです。

public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied()
{
    return p => p.IsCharityMatching(this.charityName, this.charityReference);
}

IsCharityMatchingメソッドは次のとおりです。

public bool IsCharityMatching(string name, string referenceNumber)
{
    bool exists = true;

    if (!String.IsNullOrEmpty(name))
    {
        if (!this.registeredName.ToLower().Contains(name.ToLower()) &&
            !this.alias.ToLower().Contains(name.ToLower()) &&
           !this.charityId.ToLower().Contains(name.ToLower()))
        {
            exists = false;
        }
    }

    if (!String.IsNullOrEmpty(referenceNumber))
    {
        if (!this.charityReference.ToLower().Contains(referenceNumber.ToLower()))
        {
            exists = false;
        }
    }

    return exists;
}

さらに情報が必要な場合はお知らせください。

どうもありがとう、

アネリー

4

5 に答える 5

137

おわかりのように、Entity Framework は実際にはクエリの一部として C# コードを実行できません。クエリを実際の SQL ステートメントに変換できる必要があります。これを機能させるには、クエリ式を Entity Framework が処理できる式に再構築する必要があります。

public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied()
{
    string name = this.charityName;
    string referenceNumber = this.referenceNumber;
    return p => 
        (string.IsNullOrEmpty(name) || 
            p.registeredName.ToLower().Contains(name.ToLower()) ||
            p.alias.ToLower().Contains(name.ToLower()) ||
            p.charityId.ToLower().Contains(name.ToLower())) &&
        (string.IsNullOrEmpty(referenceNumber) ||
            p.charityReference.ToLower().Contains(referenceNumber.ToLower()));
}
于 2011-08-31T15:43:38.653 に答える