3

ユーザー定義のフィルターに従って、次のような署名を使用して、指定されたオブジェクトのセットを返すジェネリック拡張メソッドを作成したいと思います。

public static IEnumerable<T> GetObjects<T>(this ObjectSet<T> os, string fieldName, object value) where T : EntityObject {}

もちろん、複数のフィルターを処理するように署名を変更することもできますが、最初に単一フィールドフィルターに焦点を当てましょう。

これを行うLinqクエリをどのように記述しますか?

4

1 に答える 1

6

ラムダ式を動的に構築Queryable.Whereし、次の式でosを呼び出す必要があります。

public static IQueryable<T> GetObjects<T>(this ObjectSet<T> os, 
                                          string fieldName, object value)
{
    var param = Expression.Parameter(typeof(T), "x");
    var body = Expression.Equal(
        Expression.PropertyOrField(param, fieldName), 
        Expression.Constant(value, value.GetType()));
    var lambda = Expression.Lambda<Func<T, bool>>(body, param);
    return os.Where(lambda);
}
于 2012-11-11T17:49:48.843 に答える