示例#1
0
        public IEnumerable <dynamic> Select(Filter filter)
        {
            var query = _queryBuilder.Build(Query.Select, _table, filter);

            var parameters = filter.Parameters.ToDictionary(x => "@" + x.Key, x => x.Value);
            var result     = _db.Execute(query, r => Map(r, filter.DetailMode), parameters).ToList();

            return(result);
        }
        public SqlQueryContext Build(SqlQueryContext query, IHaveSelectionSet context, string alias)
        {
            query.Select($"{alias}.Id");
            query.SplitOn <Person>("Id");

            var fields = context.GetSelectedFields();

            if (fields.ContainsKey("firstName"))
            {
                query.Select($"{alias}.FirstName");
            }
            if (fields.ContainsKey("lastName"))
            {
                query.Select($"{alias}.LastName");
            }
            if (fields.ContainsKey("companies"))
            {
                var personCompanies = $"{alias}PersonCompany";
                var companyAlias    = $"{alias}Company";
                query
                .LeftJoin($"PersonCompany {personCompanies} ON {alias}.Id = {personCompanies}.PersonId")
                .LeftJoin($"Company {companyAlias} ON {personCompanies}.CompanyId = {companyAlias}.Id");
                query = emailQueryBuilder.Build(query, fields["companies"], companyAlias);
            }
            if (fields.ContainsKey("emails"))
            {
                var personEmailAlias = $"{alias}PersonEmail";
                var emailAlias       = $"{alias}Email";
                query
                .LeftJoin($"PersonEmail {personEmailAlias} ON {alias}.Id = {personEmailAlias}.PersonId")
                .LeftJoin($"Email {emailAlias} ON {personEmailAlias}.EmailId = {emailAlias}.Id");
                query = emailQueryBuilder.Build(query, fields["emails"], emailAlias);
            }
            if (fields.ContainsKey("phones"))
            {
                var personPhoneAlias = $"{alias}PersonPhone";
                var phoneAlias       = $"{alias}Phone";
                query
                .LeftJoin($"PersonPhone {personPhoneAlias} ON {alias}.Id = {personPhoneAlias}.PersonId")
                .LeftJoin($"Phone {phoneAlias} ON {personPhoneAlias}.PhoneId = {phoneAlias}.Id");
                query = phoneQueryBuilder.Build(query, fields["phones"], phoneAlias);
            }
            if (fields.ContainsKey("supervisor"))
            {
                var supervisorAlias = $"{alias}Supervisor";
                query.LeftJoin($"Person {supervisorAlias} ON {alias}.SupervisorId = {supervisorAlias}.Id");
                query = Build(query, fields["supervisor"], supervisorAlias);
            }
            if (fields.ContainsKey("careerCounselor"))
            {
                var careerCounselorAlias = $"{alias}CareerCounselor";
                query.LeftJoin($"Person {careerCounselorAlias} ON {alias}.CareerCounselorId = {careerCounselorAlias}.Id");
                query = Build(query, fields["careerCounselor"], careerCounselorAlias);
            }

            return(query);
        }
示例#3
0
        public PersonQuery(
            IEntityMapperFactory entityMapperFactory,
            IQueryBuilder <Person> personQueryBuilder,
            IServiceProvider serviceProvider)
        {
            Field <ListGraphType <PersonType> >(
                "people",
                description: "A list of people.",
                resolve: context =>
            {
                var alias = "person";
                var query = SqlBuilder.From($"Person {alias}");
                query     = personQueryBuilder.Build(query, context.FieldAst, alias);

                // Create a mapper that understands how to uniquely identify the 'Person' class.
                var personMapper = entityMapperFactory.Build <Person>(person => person.Id);

                using (var connection = serviceProvider.GetRequiredService <IDbConnection>())
                {
                    var results = query.Execute(connection, personMapper);
                    return(results);
                }
            }
                );

            Field <PersonType>(
                "person",
                description: "Gets a person by ID.",
                arguments: new QueryArguments(
                    new QueryArgument <IntGraphType> {
                Name = "id", Description = "The ID of the person."
            }
                    ),
                resolve: context =>
            {
                var id    = context.Arguments["id"];
                var alias = "person";
                var query = SqlBuilder
                            .From($"Person {alias}")
                            .Where($"{alias}.Id = @id", new { id });

                query = personQueryBuilder.Build(query, context.FieldAst, alias);

                // Create a mapper that understands how to uniquely identify the 'Person' class.
                var personMapper = entityMapperFactory.Build <Person>(person => person.Id);

                using (var connection = serviceProvider.GetRequiredService <IDbConnection>())
                {
                    var results = query.Execute(connection, personMapper);
                    return(results.FirstOrDefault());
                }
            }
                );
        }
示例#4
0
        public QueryContainer Create <TRequest>(TRequest request, QueryContainerDescriptor <QueryableAccount> q)
        {
            GetAccountListRequest accountListRequest = request as GetAccountListRequest;

            if (accountListRequest == null)
            {
                throw new ArgumentNullException($"{nameof(request).ToString()} shouldn't be null.");
            }


            if (!string.IsNullOrEmpty(accountListRequest.SearchText))
            {
                _queryBuilder
                .WithWildstarQuery(accountListRequest.SearchText,
                                   new List <string> {
                    "paymentReference", "tenure.fullAddress", "tenure.primaryTenants.fullName"
                })
                .WithExactQuery(accountListRequest.SearchText,
                                new List <string> {
                    "paymentReference", "tenure.fullAddress", "tenure.primaryTenants.fullName"
                });
            }

            return(_queryBuilder.Build(q));
        }
        public FormQuery(IEntityMapperFactory entityMapperFactory,
                         IQueryBuilder <Form> employeeQueryBuilder, IServiceProvider serviceProvider)
        {
            Name = "Query";
            Field <ListGraphType <FormType> >("Forms"
                                              , resolve: context =>
            {
                var alias = "form";
                var query = SqlBuilder
                            .From($"Form {alias}");

                query = employeeQueryBuilder.Build(query, context.FieldAst, alias);

                var formMapper = entityMapperFactory.Build <Form>(
                    form => (form.Form_Id),
                    context.FieldAst,
                    query.GetSplitOnTypes()
                    );

                using (var connection = serviceProvider.GetRequiredService <IDbConnection>())
                {
                    var results = query.Execute(connection, formMapper);
                    return(results);
                }
            });
        }
示例#6
0
        public SqlQueryContext Build(SqlQueryContext query, IHaveSelectionSet context, string alias)
        {
            query.Select($"{alias}.Form_Id");
            query.SplitOn <Form>("Form_Id");

            var fields = context.GetSelectedFields();

            foreach (var kvp in fields)
            {
                switch (kvp.Key)
                {
                case "identification": query.Select($"{alias}.Identification"); break;

                case "formCreationDate": query.Select($"{alias}.FormCreationDate"); break;

                case "formCreationHour": query.Select($"{alias}.FormCreationHour"); break;

                case "attestationStatus": query.Select($"{alias}.AttestationStatus"); break;

                case "typeForm": query.Select($"{alias}.TypeForm"); break;

                case "employerDeclarations":
                {
                    var employerDeclarationAlias = $"{alias}EmployerDeclaration";
                    query.LeftJoin($"EmployerDeclaration {employerDeclarationAlias} ON {alias}.Form_Id = {employerDeclarationAlias}.Form_Id");
                    query = _employerDeclarationBuilder.Build(query, kvp.Value, employerDeclarationAlias);
                }
                break;
                }
            }

            return(query);
        }
示例#7
0
        public async void Build_PriceDesc3SortQueryString_ShouldReturnAllProductsWithTheSortOrder()
        {
            // 2.1. resolve dependency
            using (var container = _builder.Build())
                using (var scope = container.BeginLifetimeScope())
                {
                    // resolve _context
                    CatalogApiDbContext _context = scope.Resolve <CatalogApiDbContext>();
                    // seed initial data in inmemory
                    _context = await SetupInitialDB(_context);

                    // 3. qs dummy
                    string priceDescSortQueryString = "?sort=3";
                    NameValueCollection qsDummy     = HttpUtility.ParseQueryString(priceDescSortQueryString);

                    // act
                    IQueryBuilder <Product> productQueryBuilder = scope.Resolve <IQueryBuilder <Product> >();
                    var products = await productQueryBuilder.Build(qsDummy);

                    var result = products.Select(p => p.Price).ToList();

                    // assert
                    Assert.True(result.Zip(result.Skip(1), (a, b) => new { a, b }).All(p => p.a > p.b));
                }
        }
示例#8
0
        public SqlQueryContext Build(SqlQueryContext query, IHaveSelectionSet context, string alias)
        {
            query.Select($"{alias}.Id");
            query.SplitOn <Company>("Id");

            var fields = context.GetSelectedFields();

            if (fields.ContainsKey("name"))
            {
                query.Select($"{alias}.Name");
            }
            if (fields.ContainsKey("emails"))
            {
                var companyEmailAlias = $"{alias}CompanyEmail";
                var emailAlias        = $"{alias}Email";
                query
                .LeftJoin($"CompanyEmail {companyEmailAlias} ON {alias}.Id = {companyEmailAlias}.PersonId")
                .LeftJoin($"Email {emailAlias} ON {companyEmailAlias}.EmailId = {emailAlias}.Id");
                query = emailQueryBuilder.Build(query, fields["emails"], emailAlias);
            }
            if (fields.ContainsKey("phones"))
            {
                var companyPhoneAlias = $"{alias}CompanyPhone";
                var phoneAlias        = $"{alias}Phone";
                query
                .LeftJoin($"CompanyPhone {companyPhoneAlias} ON {alias}.Id = {companyPhoneAlias}.PersonId")
                .LeftJoin($"Phone {phoneAlias} ON {companyPhoneAlias}.PhoneId = {phoneAlias}.Id");
                query = phoneQueryBuilder.Build(query, fields["phones"], phoneAlias);
            }

            return(query);
        }
示例#9
0
        public async void Build_SubCategoryQueryString_ShouldReturnAllProductsWhoseSubCategoryMatchTheQueryString()
        {
            // 2.1. resolve dependency
            using (var container = _builder.Build())
                using (var scope = container.BeginLifetimeScope())
                {
                    // resolve _context
                    CatalogApiDbContext _context = scope.Resolve <CatalogApiDbContext>();
                    // seed initial data in inmemory
                    _context = await SetupInitialDB(_context);

                    // 3. qs dummy
                    string SubCategoryQueryString = "?subcategory=40";
                    NameValueCollection qsDummy   = HttpUtility.ParseQueryString(SubCategoryQueryString);

                    // act
                    IQueryBuilder <Product> productQueryBuilder = scope.Resolve <IQueryBuilder <Product> >();
                    var products = await productQueryBuilder.Build(qsDummy);

                    var result = products.All(p => (int)p.SubCategory.Id == 40);

                    _output.WriteLine(JsonConvert.SerializeObject(products, Formatting.Indented));

                    // assert
                    Assert.NotEmpty(products);
                    Assert.True(result);
                }
        }
示例#10
0
        public async void Build_KeyWordQueryString_ShouldReturnAllProductsWhoseKeyWordMatchTheQueryString()
        {
            // 2.1. resolve dependency
            using (var container = _builder.Build())
                using (var scope = container.BeginLifetimeScope())
                {
                    // resolve _context
                    CatalogApiDbContext _context = scope.Resolve <CatalogApiDbContext>();
                    // seed initial data in inmemory
                    _context = await SetupInitialDB(_context);

                    // 2.2. dummy keyword
                    string keywordDummy = "Table";

                    // 3. qs dummy
                    string KeyWordQueryString   = "?keyword=" + keywordDummy;
                    NameValueCollection qsDummy = HttpUtility.ParseQueryString(KeyWordQueryString);

                    // act
                    IQueryBuilder <Product> productQueryBuilder = scope.Resolve <IQueryBuilder <Product> >();
                    var products = await productQueryBuilder.Build(qsDummy);

                    var result = products.All(p => p.Name.Contains(keywordDummy) || p.Description.Contains(keywordDummy));
                    _output.WriteLine(JsonConvert.SerializeObject(products, Formatting.Indented));

                    // assert
                    Assert.NotEmpty(products);
                    Assert.True(result);
                }
        }
示例#11
0
        public QueryContainer Create <TRequest>(TRequest request, QueryContainerDescriptor <QueryablePerson> q)
        {
            if (!(request is GetPersonListRequest personListRequest))
            {
                throw new ArgumentNullException($"{nameof(request).ToString()} shouldn't be null.");
            }

            _queryBuilder
            .WithWildstarQuery(personListRequest.SearchText,
                               new List <string> {
                "firstname", "surname"
            })
            .WithExactQuery(personListRequest.SearchText,
                            new List <string> {
                "firstname", "surname"
            }, new ExactSearchQuerystringProcessor());

            if (personListRequest.PersonType.HasValue)
            {
                _queryBuilder.WithFilterQuery(string.Join(",", personListRequest.PersonType.Value.GetPersonTypes()), new List <string> {
                    "tenures.type"
                });
            }

            return(_queryBuilder.Build(q));
        }
示例#12
0
        public async void Build_ReviewScoreDesc9SortQueryString_ShouldReturnAllProductsWithTheSortOrder()
        {
            // 2.1. resolve dependency
            using (var container = _builder.Build())
                using (var scope = container.BeginLifetimeScope())
                {
                    // resolve _context
                    CatalogApiDbContext _context = scope.Resolve <CatalogApiDbContext>();
                    // seed initial data in inmemory
                    _context = await SetupInitialDB(_context);

                    // 3. qs dummy
                    string ReviewScoreDescSortQueryString = "?sort=9";
                    NameValueCollection qsDummy           = HttpUtility.ParseQueryString(ReviewScoreDescSortQueryString);

                    // act
                    IQueryBuilder <Product> productQueryBuilder = scope.Resolve <IQueryBuilder <Product> >();
                    var products = await productQueryBuilder.Build(qsDummy);

                    var result = products.Select(p => p.Reviews.Average(r => (int?)r.Score) ?? 0).ToList();

                    _output.WriteLine(JsonConvert.SerializeObject(result));

                    // assert
                    Assert.True(result.Zip(result.Skip(1), (a, b) => new { a, b }).All(p => p.a <= p.b));
                }
        }
示例#13
0
        public async void Build_IQueryable_ShouldConstructedWithoutWhereAndOrderByClause()
        {
            // 2.1. resolve dependency
            using (var container = _builder.Build())
                using (var scope = container.BeginLifetimeScope())
                {
                    // resolve context
                    _context = scope.Resolve <CatalogApiDbContext>();
                    // seed initial data in inmemory
                    _context = await SetupInitialDB(_context);

                    // expectedResult
                    var expectedResult = ProductFaker.GetProductList(50).Count;

                    // 3. qs dummy
                    NameValueCollection qsDummy = HttpUtility.ParseQueryString("");

                    // act
                    IQueryBuilder <Product> productQueryBuilder = scope.Resolve <IQueryBuilder <Product> >();
                    var result = await productQueryBuilder.Build(qsDummy);

                    var resultCount = result.Count;

                    // assert
                    Assert.Equal(expectedResult, resultCount);
                }
        }
示例#14
0
        [Route("search")]// since we have multiple post actions need to mention route explicitly
        public async Task <ActionResult> Query(IList <Expression> expressions)
        {
            try
            {
                _logger.LogInformation(LoggingEvents.SearchItem, "Searching for profile");

                var profile = await _Repository.Query(_queryBuilder.Build(expressions));

                if (profile == null)
                {
                    _logger.LogError(LoggingEvents.SearchItem, "Something must have gone wrong in the profiles repo since its not an empty list is returned");
                }
                else if (profile.Count == 0)
                {
                    return(NotFound());
                }

                return(Ok(profile));
            }
            catch (Exception ex)
            {
                _logger.LogError(LoggingEvents.SearchItemFailed, "Error Executing the search query: {expressions}", JsonConvert.SerializeObject(expressions));
                return(StatusCode(500, ex.ToErrorResponse(LoggingEvents.SearchItemFailed)));
            }
        }
示例#15
0
        public async void Build_NoQueryString_ShouldReturnAllProductsWithDateAscOrder()
        {
            // 2.1. resolve dependency
            using (var container = _builder.Build())
                using (var scope = container.BeginLifetimeScope())
                {
                    // resolve _context
                    _context = scope.Resolve <CatalogApiDbContext>();
                    // seed initial data in inmemory
                    _context = await SetupInitialDB(_context);

                    // 3. qs dummy
                    string noQueryString        = "";
                    NameValueCollection qsDummy = HttpUtility.ParseQueryString("");

                    // act
                    IQueryBuilder <Product> productQueryBuilder = scope.Resolve <IQueryBuilder <Product> >();
                    var products = await productQueryBuilder.Build(qsDummy);

                    var result = products.Select(p => p.CreationDate).ToList();

                    _output.WriteLine(JsonConvert.SerializeObject(result, Formatting.Indented));

                    // assert
                    Assert.True(result.Zip(result.Skip(1), (a, b) => new { a, b }).All(p => DateTime.Compare(p.a.Date, p.b.Date) <= 0));
                }
        }
示例#16
0
        private IQuery buildFetchManyQuery(Context context, IStore store)
        {
            IQueryBuilder builder = store.NewQueryBuilder();

            if (type != null)
            {
                AttributeInfo info = new AttributeInfo("category", TypeFamily.TEXT, true, null);
                builder.Verify(info, MatchOp.CONTAINS, type.GetTypeName());
            }
            if (predicate != null)
            {
                if (!(predicate is IPredicateExpression))
                {
                    throw new SyntaxError("Filtering expression must be a predicate !");
                }
                ((IPredicateExpression)predicate).interpretQuery(context, builder);
            }
            if (type != null && predicate != null)
            {
                builder.And();
            }
            builder.SetFirst(InterpretLimit(context, first));
            builder.SetLast(InterpretLimit(context, last));
            if (include != null)
            {
                builder.Project(include);
            }
            if (orderBy != null)
            {
                orderBy.interpretQuery(context, builder);
            }
            return(builder.Build());
        }
        public SqlQueryContext Build(SqlQueryContext query, IHaveSelectionSet context, string alias)
        {
            query.Select($"{alias}.Id");
            query.SplitOn <Person>("Id");

            var fields = context.GetSelectedFields();

            foreach (var kvp in fields)
            {
                switch (kvp.Key)
                {
                case "firstName": query.Select($"{alias}.FirstName"); break;

                case "lastName": query.Select($"{alias}.LastName"); break;

                case "emails":
                {
                    var emailAlias = $"{alias}Email";
                    query.LeftJoin($"Email {emailAlias} ON {alias}.Id = {emailAlias}.PersonId");
                    query = emailQueryBuilder.Build(query, kvp.Value, emailAlias);
                }
                break;

                case "phones":
                {
                    var phoneAlias = $"{alias}Phone";
                    query.LeftJoin($"Phone {phoneAlias} ON {alias}.Id = {phoneAlias}.PersonId");
                    query = phoneQueryBuilder.Build(query, kvp.Value, phoneAlias);
                }
                break;
                }
            }

            return(query);
        }
示例#18
0
        public async Task <PagedResult <T> > RunAsync <T, TQuery>(TQuery query) where TQuery : Query
        {
            var result = new PagedResult <T>();

            await _transactionManager
            .DoInTransactionAsync(
                async() =>
            {
                var connection    = _transactionManager.GetCurrentConnection();
                var compiledQuery = _queryBuilder.Build(query);
                object parameters = compiledQuery.Parameters;

                if (query.Size.Value > 0)
                {
                    result.Data = (await connection.QueryAsync <T>(compiledQuery.Sql, parameters)).ToList();
                }

                result.Total = await connection.QueryFirstOrDefaultAsync <long>(compiledQuery.CountSql, parameters);

                result.PageSize    = query.Size.Value;
                result.CurrentPage = query.Page.Value;
            });

            return(result);
        }
示例#19
0
        public async void Build_MinPriceQueryString_ShouldReturnAllProductsWhoseMinPriceMatchTheQueryString()
        {
            // 2.1. resolve dependency
            using (var container = _builder.Build())
                using (var scope = container.BeginLifetimeScope())
                {
                    // resolve _context
                    CatalogApiDbContext _context = scope.Resolve <CatalogApiDbContext>();
                    // seed initial data in inmemory
                    _context = await SetupInitialDB(_context);

                    // 2.2. dummy minprice
                    decimal minpriceDummy = 30000m;

                    // 3. qs dummy
                    string MinPriceQueryString  = "?minprice=" + minpriceDummy;
                    NameValueCollection qsDummy = HttpUtility.ParseQueryString(MinPriceQueryString);

                    // act
                    IQueryBuilder <Product> productQueryBuilder = scope.Resolve <IQueryBuilder <Product> >();
                    var products = await productQueryBuilder.Build(qsDummy);

                    //var averageList = products.Select(p => p.Reviews.DefaultIfEmpty().Average(r => (int)r.Score));
                    var result = products.All(p => p.Price > minpriceDummy);
                    _output.WriteLine(JsonConvert.SerializeObject(products, Formatting.Indented));

                    // assert
                    Assert.NotEmpty(products);
                    Assert.True(result);
                }
        }
        public IEnumerable <FoodTruck> GetFoodTrucks(Coordinate coordinate)
        {
            var           _sodaClient  = new SodaClient(_appSettingsManager.AppSettings.Value.SanFranciscoFoodTruckApiUrl, _appSettingsManager.AppSettings.Value.AppToken);
            var           resource     = _sodaClient.GetResource <Dictionary <string, object> >(_appSettingsManager.AppSettings.Value.ResourceId);
            IQueryBuilder queryBuilder = _queryBuilders.Where(q => q.IsQueryType(QueryType.Within)).Single();
            string        query        = queryBuilder.Build(coordinate.ConvertToFieldFilters());
            var           soql         = _soqlQuery.Where(query).Limit(_appSettingsManager.AppSettings.Value.SoqlQueryLimit);
            var           results      = resource.Query <FoodTruck>(soql);

            return(results);
        }
示例#21
0
        private void ExecuteQueryEntries(IQueryBuilder query, Action <DynamicData> fillArg, List <DynamicData> datas)
        {
            using (var temp = SqlHelper.BorrowData())
            {
                var param = temp.Item;
                fillArg(param);

                var sql = query.Build(param);//编译表达式获取执行文本
                SqlHelper.Query(this.ConnectionName, sql, param, datas);
            }
        }
示例#22
0
        private void Execute(IQueryBuilder query, Action <DynamicData> fillArg)
        {
            using (var temp = SqlHelper.BorrowData())
            {
                var param = temp.Item;
                fillArg(param);

                var sql = query.Build(param, this);
                SqlHelper.Execute(this.ConnectionName, sql, param);
            }
        }
示例#23
0
        private void SaveChanges()
        {
            kernel.ClearTimeout(scheduleHandler);
            scheduleHandler = null;
            try
            {
                lock (SyncLock)
                {
                    var queue = BuildSaveQueue();
                    if (queue.Count > 0)
                    {
                        logger.LogDebug("Saving all pending changes to the database.");
                    }

                    using (var con = db.GetConnection())
                    {
                        con.Open();
                        while (queue.TryPeek(out var saveData))
                        {
                            var query = queryBuilder.Build(saveData);
                            if (query == null)
                            {
                                return;
                            }

                            var command = con.CreateCommand();
                            command.CommandText = query.Command;

                            var result = command.ExecuteNonQuery();
                            if (result == 0)
                            {
                                logger.LogError("Unable to save data! Abort Query failed");
                                return;
                            }

                            ClearChangeSetState(saveData);

                            queue.Dequeue();
                        }
                        con.Close();
                    }
                }
            }

            catch (Exception exc)
            {
                logger.LogInformation("ERROR SAVING DATA!! " + exc);
            }
            finally
            {
                ScheduleNextSave();
            }
        }
示例#24
0
        private void ExecuteQueryEntry(IQueryBuilder query, Action <DynamicData> fillArg, DynamicData data)
        {
            using (var temp = SqlHelper.BorrowData())
            {
                var param = temp.Item;
                fillArg(param);
                AddToTenant(param);

                var sql = query.Build(param, this);//编译表达式获取执行文本
                SqlHelper.QueryFirstOrDefault(this.ConnectionName, sql, param, data);
            }
        }
示例#25
0
        public async Task <IList <ProductDTO> > GetList(NameValueCollection qs)
        {
            IList <Product> results = await _queryBuilder.Build(qs);

            _logger.LogDebug("result of product query satoshi: {@Result}", results);

            // 2. assign results to List<Product> DTO
            IList <ProductDTO> products = this._mapper.Map <IList <Product>, IList <ProductDTO> >(results);

            // 3. return it!!
            return(products);
        }
示例#26
0
        ///// <summary>
        ///// 根据表达式从数据库中查询数据
        ///// </summary>
        ///// <param name="expression"></param>
        ///// <param name="fillArg"></param>
        ///// <param name="level"></param>
        ///// <returns></returns>
        //private object LoadObject(string expression, Action<DynamicData> fillArg, QueryLevel level)
        //{
        //    var exp = QueryObject.Create(this, expression, level);
        //    return ExecuteQueryObject(this.ImplementOrElementType, exp, fillArg);
        //}

        private DomainObject ExecuteQueryObject(Type objectType, IQueryBuilder query, Action <DynamicData> fillArg)
        {
            using (var temp = SqlHelper.BorrowData())
            {
                var param = temp.Item;
                fillArg(param);

                var sql  = query.Build(param);//编译表达式获取执行文本
                var data = SqlHelper.QueryFirstOrDefault(this.ConnectionName, sql, param);
                return(CreateObject(objectType, data));
            }
        }
示例#27
0
        public async void Build_AllQueryString_ShouldReturnAllProductsWhoseAllMatchTheQueryString()
        {
            // 2.1. resolve dependency
            using (var container = _builder.Build())
                using (var scope = container.BeginLifetimeScope())
                {
                    // resolve _context
                    CatalogApiDbContext _context = scope.Resolve <CatalogApiDbContext>();
                    // seed initial data in inmemory
                    _context = await SetupInitialDBForAllQueryString(_context);

                    // 2.2. dummy all
                    int     categoryIdDummy    = 0;
                    int     subCategoryIdDummy = 0;
                    string  keywordDummy       = "collaborative";
                    int     reviewscoreDummy   = 5;
                    decimal maxpriceDummy      = 70000m;
                    decimal minpriceDummy      = 60000m;

                    // 3. qs dummy
                    string AllQueryString = "?category=" + categoryIdDummy
                                            + "&subcategory=" + subCategoryIdDummy
                                            + "&keyword=" + keywordDummy
                                            + "&reviewscore=" + reviewscoreDummy
                                            + "&maxprice=" + maxpriceDummy
                                            + "&minprice=" + minpriceDummy;

                    NameValueCollection qsDummy = HttpUtility.ParseQueryString(AllQueryString);

                    // act
                    IQueryBuilder <Product> productQueryBuilder = scope.Resolve <IQueryBuilder <Product> >();
                    var products = await productQueryBuilder.Build(qsDummy);

                    //var averageList = products.Select(p => p.Reviews.DefaultIfEmpty().Average(r => (int)r.Score));
                    var result = products.All(p =>
                    {
                        return((int)p.SubCategory.CategoryId == categoryIdDummy &&
                               (int)p.SubCategory.Id == subCategoryIdDummy &&
                               p.Name.Contains(keywordDummy) || p.Description.Contains(keywordDummy) &&
                               Math.Round(p.Reviews.DefaultIfEmpty().Average(r => (int)r.Score)) == reviewscoreDummy &&
                               p.Price < maxpriceDummy &&
                               p.Price > minpriceDummy);
                    });
                    _output.WriteLine(JsonConvert.SerializeObject(_context.Products, Formatting.Indented));

                    // assert
                    Assert.NotEmpty(products);
                    Assert.True(result);
                }
        }
示例#28
0
        private int GetCount(IQueryBuilder query, Action <DynamicData> fillArg)
        {
            int count = 0;

            //获取总数据数
            using (var temp = SqlHelper.BorrowData())
            {
                var param = temp.Item;
                fillArg(param);

                var sql = query.Build(param);
                count = SqlHelper.ExecuteScalar <int>(this.ConnectionName, sql, param);
            }
            return(count);
        }
示例#29
0
        public static SqlQueryContext GetQuery(this IPersonRepository personRepository,
                                               ResolveConnectionContext <object> context,
                                               IQueryBuilder <Person> personQueryBuilder,
                                               string sWhere = "")
        {
            var alias = "Person";

            var query = SqlBuilder
                        .From <Person>(alias)
                        .OrderBy($"{alias}.CreateDate");

            query = !string.IsNullOrEmpty(sWhere) ? query.Where(sWhere) : query;

            return(personQueryBuilder.Build(query, context.FieldAst, alias));
        }
示例#30
0
        public SqlQueryContext Build(SqlQueryContext query, IHaveSelectionSet context, string alias)
        {
            query.Select($"{alias}.Id");
            query.SplitOn <Person>("Id");

            var fields = context.GetSelectedFields();

            foreach (var kvp in fields)
            {
                switch (kvp.Key)
                {
                case "firstName": query.Select($"{alias}.FirstName"); break;

                case "lastName": query.Select($"{alias}.LastName"); break;

                case "emails":
                {
                    var emailAlias = $"{alias}Email";
                    query.LeftJoin($"Email {emailAlias} ON {alias}.Id = {emailAlias}.PersonId");
                    query = emailQueryBuilder.Build(query, kvp.Value, emailAlias);
                }
                break;

                case "phones":
                {
                    var phoneAlias = $"{alias}Phone";
                    query.LeftJoin($"Phone {phoneAlias} ON {alias}.Id = {phoneAlias}.PersonId");
                    query = phoneQueryBuilder.Build(query, kvp.Value, phoneAlias);
                }
                break;
                }
            }

            if (fields.ContainsKey("supervisor"))
            {
                var supervisorAlias = $"{alias}Supervisor";
                query.LeftJoin($"Person {supervisorAlias} ON {alias}.SupervisorId = {supervisorAlias}.Id");
                query = Build(query, fields["supervisor"], supervisorAlias);
            }
            if (fields.ContainsKey("careerCounselor"))
            {
                var careerCounselorAlias = $"{alias}CareerCounselor";
                query.LeftJoin($"Person {careerCounselorAlias} ON {alias}.CareerCounselorId = {careerCounselorAlias}.Id");
                query = Build(query, fields["careerCounselor"], careerCounselorAlias);
            }

            return(query);
        }
示例#31
0
 public ISitecoreSearchResult Execute(IQueryBuilder queryBuilder, int noOfResults = Int32.MaxValue - 1, Sort sort = null)
 {
     return Execute(queryBuilder.Build(), noOfResults, sort);
 }