1

述語ビルダーを使用していますが、正常に動作しています

 var filter = sortKeys.Aggregate(filter, (currentFilter, sortkey) => currentFilter.Or(
                            x => x.Appointments.Any(y => y.RowStatus == Constants.CurrentRowStatus )));

外出先で条件を追加して関数を再利用できるように、予定内の条件を別の述語ビルダーに分割しようとしています。

式を作成してからメインの述語ビルダーで使用しようとしましたが、失敗しています

private static Expression<Func<Appointment, bool>> TmpApt(string status)
    {
        var predicate = PredicateBuilder.False<Appointment>();

        predicate = predicate.Or(p => p.RowStatus == status);

        return predicate;
    }

上記の式を使用するように主述語を変更

var filter = sortKeys.Aggregate(PredicateBuilder.True<Person>(), (current, s) =>
                                current.Or(x => x.Appointments.Any(TmpApt(s))));

それはエラーを示しています

引数の型 ' System.Linq.Expressions.Expression<System.Func<Appointment,bool>>' はパラメーターの型に割り当てられませんSystem.Func<Appointment,bool>

Expand のような LinqKit 拡張メソッドも試しましたが、解決策を見つけることができました。

LINQ で再利用可能な述語式も試した場合、コンパイル中にエラーは表示されませんが、アプリケーション側では表示されます

クエリ演算子 ' Any' にサポートされていないオーバーロードが使用されています。

エラーを解決する方法や、別の解決策を提案する方法を教えてください。

4

1 に答える 1

2

LINQKit を使用して、使用したい場所にある式を呼び出すことができます。

var predicate = TmpApt();
var filter = sortKeys.Aggregate(PredicateBuilder.False<Person>(),
    (current, s) => current.Or(x =>
        x.Appointments.Any(appointment => predicate.Invoke(appointment))))
        .Expand();

TmpApt実装にバグがあるため、LINQKit が正常に評価するには、変数にプルアウトする必要があることに注意してください。

Falseまた、集計操作をに初期True化する必要があることに注意してくださいtrue

TmpAptまた、実装を次のように単純化できることにも注意してください。

private static Expression<Func<Appointment, bool>> TmpApt()
{
    return p => p.RowStatus == Constants.CurrentRowStatus;
}

Orここでは述語ビルダーを使用する必要はありませんFalse

于 2014-09-25T15:40:05.917 に答える