В представлении Redux больше похожа на параллельную структуру иерархии компонентов вашего приложения. Затем, когда вы связываете компоненты для редукции, вы открываете канал связи для изменения состояния и получения только определенных обновлений. Redux заботится о том, чтобы инициировать повторную обработку / рендеринг только тех компонентов, на которые влияет изменение состояния.
С другой стороны, если вы управляете состоянием, отправляя данные вверх / вниз по иерархии компонентов, вся структура компонентов получает новые реквизиты (я предполагаю, что вы используете реагировать), и все компоненты «перерабатываются», если только вы реализован метод shouldComponentUpdate, который может повлиять на вашу производительность. Это можно увидеть, если переопределить «componentWillReceiveProps» и утешить каждую обработку.
Для небольшого приложения проще всего использовать объект окна, но по мере роста вашего приложения это может быть проблемой для удобства обслуживания, а также есть другие преимущества использования избыточности, подобной безопасности.
Что-то вроде этого работает, по крайней мере, в моих тестах:
Expression<Func<DataContext, IQueryable<User>> queryableExpression = GetUsers();
var expressionWithSomeAddedStuff = (DataContext dc) => from u in queryableExpression.Invoke(dc) where ....;
var expressionThatCanBeCompiled = expressionWithSomeAddedStuff.Expand();
var foo = CompiledQuery.Compile<DataContext, IQueryable<User>>(expressionThatCanBeCompiled);
Это выглядит немного многословно, и, вероятно, вы можете внести улучшения.
Ключевым моментом является то, что он использует методы Invoke и Expand из LinqKit. По сути, они позволяют вам создать запрос посредством композиции, а затем скомпилировать готовый результат.