6

これをシミュレートするために、Linq 式ツリーを使用して式を作成したいと考えています。

List<int> ids = new List<int>();

// Fill ids with data

db.Where(a => ids.Contains(a.Id));

これは私が得た場所ですが、まだ何かが欠けています:

MemberExpression me = Expression.Property(pe, typeof(T).GetProperty(property));

Expression callContains = Expression.Call(typeof(System.Linq.Enumerable), "Contains", new Type[] { me.Type }, me);

やりたいことをどうやったらちゃんとできるの?

4

3 に答える 3

15

Containsは拡張メソッドであるため、コレクションidsをパラメーター (この場合はConstantExpression.

実装は少し異なる場合がありますが、次のようになります。

public static IQueryable<T> DynamicContains<T, TProperty>(
    this IQueryable<T> query, 
    string property, 
    IEnumerable<TProperty> items)
{
    var pe = Expression.Parameter(typeof(T));
    var me = Expression.Property(pe, property);
    var ce = Expression.Constant(items); 
    var call = Expression.Call(typeof(Enumerable), "Contains", new[] { me.Type }, ce, me);
    var lambda = Expression.Lambda<Func<T, bool>>(call, pe);
    return query.Where(lambda);
}

db.DynamicContains("Id", ids);
于 2013-08-28T15:31:41.167 に答える
0

Mono.CSharp dll への参照を追加できます。次に、Evaluator クラスを使用してその場で csharp コードをコンパイルし、文字列を連結して linq クエリを簡単に作成し、それらをコンパイルします。遅くはなく、簡単です。

于 2013-08-28T15:46:31.487 に答える
0

@pswgの回答を補完するものとして、Dynamic Not Containsは次のとおりです。

    public static IQueryable<T> DynamicNotContains<T, TProperty>(this IQueryable<T> query, string property, IEnumerable<TProperty> items)
    {        
        var pe = Expression.Parameter(typeof(T));
        var me = Expression.Property(pe, property);
        var ce = Expression.Constant(items);
        var call = Expression.Call(typeof(Enumerable), "Contains", new[] { me.Type }, ce, me);
        var lambda = Expression.Lambda<Func<T, bool>>(Expression.Not(call), pe);

        return query.Where(lambda);
    }
db.DynamicNotContains("Id", ids);
于 2017-06-06T13:40:34.760 に答える