/// <summary> /// Add select part to sql. /// </summary> /// <typeparam name="TResult"></typeparam> /// <param name="selector">The selector.</param> /// <returns> /// Query for enumerable models. /// </returns> /// <exception cref="ArgumentNullException">if <c>sqlPart</c> is null or white string.</exception> /// <remarks> /// When <c>Select</c> method is not call, query take columns by T model. /// </remarks> public IQuery <T> Select <TResult>(Func <T, TResult> selector) { Check.NotNull(selector, nameof(selector)); this.SelectExpression.SetColumnsExpression(ColumnsExpression.Create(selector, _databaseMapper.GetTableInfo <T>())); return(this); }
private Func <IDataReader, T> CreateFactory <T>(IDataReader reader) { Type type = typeof(T); if (type.IsValueType) { return(new Func <IDataReader, T>(FactoryForValueType <T>)); } else { TableInfo tableInfo = _databaseMapper.GetTableInfo <T>(); var injector = _databaseMapper.GetInjector <T>(); var dynamicMethod = new DynamicMethod(string.Format("korm_factory_{0}", _factoriesCache.Count), type, new Type[] { typeof(IDataReader) }, true); var ilGenerator = dynamicMethod.GetILGenerator(); ConstructorInfo ctor = GetConstructor(type); ilGenerator.Emit(OpCodes.Newobj, ctor); EmitReaderFields(reader, tableInfo, ilGenerator, injector); CallOnAfterMaterialize(tableInfo, ilGenerator); ilGenerator.Emit(OpCodes.Ret); return(dynamicMethod.CreateDelegate(Expression.GetFuncType(typeof(IDataReader), type)) as Func <IDataReader, T>); } }
public void UseConverter() { var idColumn = new ColumnInfo() { Name = nameof(ConverterDto.Id), PropertyInfo = GetPropertyInfo <ConverterDto>(nameof(ConverterDto.Id)) }; var nameColumn = new ColumnInfo() { Name = nameof(ConverterDto.Name), PropertyInfo = GetPropertyInfo <ConverterDto>(nameof(ConverterDto.Name)), Converter = new NullToStringConverter() }; var tableInfo = new TableInfo(new[] { idColumn, nameColumn }, new List <PropertyInfo>(), null) { Name = nameof(ConverterDto) }; KORM.Query.IQueryProvider queryProvider = Substitute.For <KORM.Query.IQueryProvider>(); IDatabaseMapper mapper = Substitute.For <IDatabaseMapper>(); mapper.GetTableInfo <ConverterDto>().Returns(tableInfo); var query = new Query <ConverterDto>(mapper, queryProvider); var generator = new CommandGenerator <ConverterDto>(tableInfo, queryProvider, query); var dto = new ConverterDto() { Id = 1, Name = null }; var convertedValue = generator.GetColumnValue(nameColumn, dto); convertedValue.Should().Be("NULL"); }
private CommandGenerator <T> CreateCommandGenerator <T>(TableInfo tableInfo) { IDatabaseMapper mapper = Substitute.For <IDatabaseMapper>(); mapper.GetTableInfo <T>().Returns(tableInfo); KORM.Query.IQueryProvider queryProvider = Substitute.For <KORM.Query.IQueryProvider>(); var query = new Query <T>(mapper, queryProvider); return(new CommandGenerator <T>(tableInfo, queryProvider, query)); }
/// <summary> /// Initializes a new instance of the <see cref="Query{T}"/> class. /// </summary> /// <param name="databaseMapper">The database mapper.</param> /// <param name="provider">The provider for executing query.</param> internal Query(IDatabaseMapper databaseMapper, IQueryProvider provider) { Check.NotNull(provider, nameof(provider)); Check.NotNull(databaseMapper, nameof(databaseMapper)); _databaseMapper = databaseMapper; _provider = provider; _expression = SelectExpression.Constant(_databaseMapper.GetTableInfo <T>(), this); }
void IQueryBaseInternal.ApplyQueryFilter(IDatabaseMapper databaseMapper, ISqlExpressionVisitor expressionVisitor) { SelectExpression select = SelectExpression; IQueryBaseInternal query = select?.OriginalQuery; if (query != null && !query.IgnoreQueryFilters) { TableInfo tableInfo = databaseMapper.GetTableInfo(select.EntityType); if (tableInfo.QueryFilter != null) { WhereExpression queryFilter = expressionVisitor.GenerateWhereCondition(tableInfo.QueryFilter, DefaultQueryFilterParameterNamePrefix); select.SetWhereExpression(queryFilter); } } }
private Func <IDataReader, T> CreateFactory <T>(IDataReader reader) { Type type = typeof(T); if (type.IsValueType) { return(new Func <IDataReader, T>(FactoryForValueType <T>)); } else { TableInfo tableInfo = _databaseMapper.GetTableInfo <T>(); IInjector injector = _databaseMapper.GetInjector <T>(); (ConstructorInfo ctor, bool isDefault) = GetConstructor(type); if (isDefault) { return(CreateFactoryForPropertySetters <T>(reader, tableInfo, injector, ctor)); } else { return(RecordModelFactory.CreateFactoryForRecords <T>(reader, tableInfo, injector, ctor)); } } }