Отражение здесь не проблема; 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
) при создании константы - в противном случае вы можете получить проблемы с нулями.