示例#1
0
        /// <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);
        }
示例#2
0
        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");
        }
示例#4
0
        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));
        }
示例#5
0
        /// <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);
        }
示例#6
0
        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));
                }
            }
        }