質問

オブジェクトタイプ T とプロパティ名を取り、渡されたプロパティの値をチェックする Expression< Func< T、bool>> を返すフィルタリングコントロールを作成したい。リフレクションを使用したくないのは、そのような表現はEFで使用できないのではないかと思うからです。 C#にはプロパティのデリゲートがないため、デリゲートを使用できません。私に何ができる?これらのコントロールを作成するために別のアプローチを使用する必要がありますか?

リフレクションを使用した最初のアプローチを次に示します。

public string FilteringField { get; set; }
public Expression<Func<T, bool>> GetFilterExpression()
{
  if (cmbValue.SelectedIndex == 1)
    return (o => (bool)typeof(T).GetProperty(FilteringField).GetValue(o, null));
  if (cmbValue.SelectedIndex == 2)
    return (o => !(bool)typeof(T).GetProperty(FilteringField).GetValue(o, null));
  return null;
}
役に立ちましたか?

解決

ここでは反射は問題ではありません。 EFはその違いに気付くことさえできません。ところで、デリゲートアプローチは、スターターではありません(EFに言及しているため)。最終的に、それは次のようなものです:

public static IQueryable<T> Where<T>(this IQueryable<T> query,
    string propertyName, object value)
{
    PropertyInfo prop = typeof(T).GetProperty(propertyName);
    var param = Expression.Parameter(typeof(T), "x");
    var body = Expression.Equal(
        Expression.Property(param, prop),
        Expression.Constant(value, prop.PropertyType)
        );
    var predicate = Expression.Lambda<Func<T, bool>>(body, param);
    return query.Where(predicate);
}

Expression.PropertyOrField(propertyName)で簡単にできることに注意してください。ここで使用しなかった理由は、定数を作成するときにメンバータイプ( prop.PropertyType )を知っていると非常に便利だからです。そうしないと、nullで問題が発生する可能性があります。

他のヒント

これは古い答えだと知っていますが、誰かがこれを見たら、私はこのプロジェクトを構築しました:

https://github.com/PoweredSoft/DynamicLinq

nugetでもダウンロードできる必要があります:

https://www.nuget.org/packages/PoweredSoft.DynamicLinq

そして、あなたは簡単にできます

query.Where("FirstName", ConditionOperators.Equal, "David");
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top