5

IQueryable Linq オブジェクトに動的 AND フィルターを作成するのに忙しいので、これが私のコードであり、動作します。

public static IQueryable<T> FilterHeaders<T>(this IQueryable<T> records, IEnumerable<ListHeader> headers)
{
    // Build linq expression to filter queryable
    if (headers != null)
    {
        var param = Expression.Parameter(typeof(T), "x");
        var body = Expression.And(Expression.Constant(true), Expression.Constant(true));

        foreach (var header in headers)
        {
            if (header.Filter != null && !String.IsNullOrWhiteSpace(header.Filter.Value))
            {
                var property = Expression.PropertyOrField(param, header.HeaderType.ToString());
                var value = Expression.Constant(header.Filter.Value.Trim(), typeof(string));
                body = Expression.AndAlso(body, Expression.Call(property, "Contains", null, value));
            }
        }
        var lambda = Expression.Lambda<Func<T, bool>>(body, param);
        return records.Where(lambda);
    }
    return records;
}

で式本体を初期化しましExpression.And(Expression.Constant(true), Expression.Constant(true))た。もっと良い方法があるはずだと私には思えます...

どのように?

4

2 に答える 2

6

あなたはただできませんか:

var body = Expression.Constant(true);

紛らわしい名前にもかかわらず、AndAlsoafter のみを使用する必要はないことに注意してください。Andそれらの違いは、との違いとよく似ています&&&-AndAlsoは論理 And 演算子でありAnd、ビットごとの演算子です。

于 2012-06-20T11:33:40.213 に答える
1

交換

Expression.And(Expression.Constant(true), Expression.Constant(true));

Expression.Constant(true); 
于 2012-06-20T11:50:01.503 に答える