private void BuildJoiner <TCompatibleRequest>(CrudRequestConfig <TCompatibleRequest> config) { if (EntityKey == null || RequestItemKey == null) { return; } var joinInfo = typeof(EnumerableExtensions) .GetMethod("FullOuterJoin", BindingFlags.Static | BindingFlags.NonPublic) .MakeGenericMethod(typeof(object), typeof(TEntity), RequestItemKey.KeyType); var makeKeySelectorInfo = typeof(CrudBulkRequestEntityConfigBuilder <TRequest, TItem, TEntity>) .GetMethod("MakeKeySelector", BindingFlags.Static | BindingFlags.NonPublic); var itemsParam = Expression.Parameter(typeof(IEnumerable <object>)); var entitiesParam = Expression.Parameter(typeof(IEnumerable <TEntity>)); var makeLeftKeySelector = makeKeySelectorInfo.MakeGenericMethod(typeof(object), RequestItemKey.KeyType); var convLeftKeyParam = Expression.Parameter(typeof(object)); var convLeftKeyCall = Expression.Invoke( RequestItemKey.KeyExpression, Expression.Convert(convLeftKeyParam, typeof(TItem))); var leftKeyExpr = Expression.Call(makeLeftKeySelector, Expression.Lambda(convLeftKeyCall, convLeftKeyParam)); var makeRightKeySelector = makeKeySelectorInfo.MakeGenericMethod(typeof(TEntity), EntityKey.KeyType); var rightKeyExpr = Expression.Call(makeRightKeySelector, Expression.Constant(EntityKey.KeyExpression)); var joinExpr = Expression.Call(joinInfo, itemsParam, entitiesParam, leftKeyExpr, rightKeyExpr); var lambdaExpr = Expression.Lambda <Func <IEnumerable <object>, IEnumerable <TEntity>, IEnumerable <Tuple <object, TEntity> > > >( joinExpr, itemsParam, entitiesParam); config.SetEntityJoiner(lambdaExpr.Compile()); }
public override void Build <TCompatibleRequest>(CrudRequestConfig <TCompatibleRequest> config) { base.Build(config); if (Selector == null) { DefaultSelector(config); } }
public void Test_RequestWithoutProfile_FindsDefaultConfig() { var defaultConfig = new CrudRequestConfig <CreateUserWithResponseRequest>(); var createUserConfig = _profileManager.GetRequestConfigFor <CreateUserWithResponseRequest>(); Assert.IsNotNull(defaultConfig); Assert.IsNotNull(createUserConfig); Assert.AreEqual(defaultConfig.GetType(), createUserConfig.GetType()); }
private void DefaultSelector <TCompatibleRequest>( CrudRequestConfig <TCompatibleRequest> config) { var requestKey = config.GetRequestKey(); var entityKey = config.GetKeyFor <TEntity>(); if (requestKey != null && entityKey != null) { var builder = new SelectorBuilder <TRequest, TEntity>(); config.SetEntitySelector <TEntity>(builder.Single(requestKey, entityKey)); } }
private void DefaultSelector <TCompatibleRequest>( CrudRequestConfig <TCompatibleRequest> config) { var itemKey = config.GetRequestKey(); var entityKey = config.GetKeyFor <TEntity>(); if (itemKey != null && entityKey != null) { var builder = new SelectorBuilder <TRequest, TEntity>(); config.SetEntitySelector <TEntity>(builder.Collection(_getRequestItems, entityKey, itemKey)); } }
public override void Build <TCompatibleRequest>(CrudRequestConfig <TCompatibleRequest> config) { if (_getRequestItems == null) { var message = $"No request item source has been defined for '{typeof(TRequest)}'." + $"Define item source by calling `{nameof(WithRequestItems)}` in the request's profile."; throw new BadCrudConfigurationException(message); } base.Build(config); if (Selector == null) { DefaultSelector(config); } BuildJoiner(config); config.SetItemHooksFor <TEntity>(_itemHooks); }
public virtual void Build <TCompatibleRequest>(CrudRequestConfig <TCompatibleRequest> config) { if (OptionsConfig != null) { config.SetOptionsFor <TEntity>(OptionsConfig); } if (ErrorHandlerFactory != null) { config.ErrorConfig.SetErrorHandlerFor(typeof(TEntity), ErrorHandlerFactory); } config.SetEntityDefault(DefaultValue); if (RequestItemKey != null) { config.SetRequestKey(RequestItemKey); } if (EntityKey != null) { config.SetEntityKey <TEntity>(EntityKey); } if (RequestItemSource != null) { config.SetEntityRequestItemSource <TEntity>(RequestItemSource); } if (Selector != null) { config.SetEntitySelector <TEntity>(Selector); } if (CreateEntity != null) { config.SetEntityCreator(CreateEntity); } if (UpdateEntity != null) { config.SetEntityUpdator(UpdateEntity); } if (CreateResult != null) { config.SetEntityResultCreator(CreateResult); } if (Sorter != null) { config.SetEntitySorter <TEntity>(Sorter); } if (_filters.Count > 0) { config.SetEntityFilters <TEntity>(_filters); } config.SetEntityHooksFor <TEntity>(EntityHooks); }