Exemplo n.º 1
0
        public async Task <IEnumerable <TResult> > ExecuteCollectionAsync <TResult>(QueryModel queryModel)
        {
            await _semaphoreSlim.WaitAsync();

            try
            {
                if (SpQueryArgs == null)
                {
                    return(Enumerable.Empty <TResult>());
                }
                SpView = new SpView();
                var queryVisitor = new SpGeneratorQueryModelVisitor <TContext>(SpQueryArgs, SpView);
                queryVisitor.VisitQueryModel(queryModel);

                if (SpQueryArgs.SkipResult)
                {
                    return(Enumerable.Empty <TResult>());
                }

                var results = await _manager.GetEntitiesAsync(typeof(TResult), SpView);

                foreach (var resultOperator in queryModel.ResultOperators)
                {
                    if (resultOperator is ReverseResultOperator)
                    {
                        results = results.Reverse();
                    }
                }

                return(results.Cast <TResult>());
            }
            finally
            {
                _semaphoreSlim.Release();
            }
        }
Exemplo n.º 2
0
        public IEnumerable <TResult> ExecuteCollection <TResult>(QueryModel queryModel)
        {
            lock (_lock)
            {
                if (SpQueryArgs == null)
                {
                    return(Enumerable.Empty <TResult>());
                }
                var spView = new SpView();
                if (!string.IsNullOrEmpty(SpQueryArgs.Query))
                {
                    var q = new Caml.Query(SpQueryArgs.Query);
                    spView.Query.Where   = q.Where;
                    spView.Query.OrderBy = q.OrderBy;
                    spView.Query.GroupBy = q.GroupBy;
                }

                SpView = spView;
                var queryVisitor = new SpGeneratorQueryModelVisitor <TContext>(SpQueryArgs, spView);
                queryVisitor.VisitQueryModel(queryModel);

                if (spView.ViewFields == null)
                {
                    spView.ViewFields =
                        new ViewFieldsCamlElement(SpQueryArgs.FieldMappings.Select(fieldMapping => fieldMapping.Value.Name));
                }
                else if (!spView.ViewFields.Any())
                {
                    spView.ViewFields.AddRange(SpQueryArgs.FieldMappings.Select(fieldMapping => fieldMapping.Value.Name));
                }

                spView.Joins           = new JoinsCamlElement();
                spView.ProjectedFields = new ProjectedFieldsCamlElement();

                foreach (var dependentLookupField in SpQueryArgs.FieldMappings.Values.OfType <DependentLookupFieldAttribute>())
                {
                    if (spView.ViewFields.Any(f => f.Name == dependentLookupField.Name))
                    {
                        if (spView.ProjectedFields == null || !spView.ProjectedFields.Any(f => f.Name == dependentLookupField.Name))
                        {
                            spView.Joins.Join(new LeftJoin(dependentLookupField.LookupFieldName, dependentLookupField.List));
                            spView.ProjectedFields.ShowField(new CamlProjectedField(dependentLookupField.Name, dependentLookupField.List, dependentLookupField.ShowField));
                        }
                    }
                }

                if (SpQueryArgs.SkipResult)
                {
                    return(Enumerable.Empty <TResult>());
                }
                Debug.WriteLine($"# Entity: {typeof(TEntity)}");
                Debug.WriteLine($"# List: {this.SpQueryArgs}");
                Debug.WriteLine("# SP Query:");
                Debug.Write(spView);
                Debug.WriteLine("");

                IEnumerable <TResult> results = _manager.GetEntities(typeof(TResult), spView).Cast <TResult>();

                foreach (var resultOperator in queryModel.ResultOperators)
                {
                    if (resultOperator is ReverseResultOperator)
                    {
                        results = results.Reverse();
                    }
                }
                return(results);
            }
        }
Exemplo n.º 3
0
        protected void VisitQueryModel(QueryModel queryModel)
        {
            if (SpQueryArgs == null)
            {
                return;
            }

            var spView = new SpView()
            {
                Scope = SpQueryArgs.ViewScope
            };

            if (!string.IsNullOrEmpty(SpQueryArgs.Query))
            {
                var q = new Caml.Query(SpQueryArgs.Query);
                spView.Query.Where   = q.Where;
                spView.Query.OrderBy = q.OrderBy;
                spView.Query.GroupBy = q.GroupBy;
            }

            SpView = spView;

            var queryVisitor = new SpGeneratorQueryModelVisitor <TContext, TEntity>(SpQueryArgs, spView);

            queryVisitor.VisitQueryModel(queryModel);

            if (spView.Query.GroupBy != null && spView.Query.OrderBy != null)
            {
                foreach (var gfieldRef in spView.Query.GroupBy.FieldRefs)
                {
                    foreach (var ofieldRef in spView.Query.OrderBy.FieldRefs)
                    {
                        if (gfieldRef.Name == ofieldRef.Name || gfieldRef.Id == ofieldRef.Id)
                        {
                            gfieldRef.Ascending = ofieldRef.Ascending;
                            break;
                        }
                    }
                }
            }

            var contentType = AttributeHelper.GetCustomAttributes <TEntity, ContentTypeAttribute>(true).LastOrDefault();

            if (contentType != null && !string.IsNullOrWhiteSpace(contentType.Id) && contentType.Id != "0x01")
            {
                var additionalWhere = new Caml.Clauses.CamlWhere(new Caml.Operators.BeginsWith("ContentTypeId", contentType.Id));
                if (spView.Query.Where == null)
                {
                    spView.Query.Where = additionalWhere;
                }
                else
                {
                    spView.Query.Where = spView.Query.Where.And(additionalWhere);
                }
            }

            if (spView.ViewFields == null)
            {
                spView.ViewFields =
                    new ViewFieldsCamlElement(SpQueryArgs.FieldMappings.Select(fieldMapping => fieldMapping.Value.Name));
            }
            else if (!spView.ViewFields.Any())
            {
                spView.ViewFields.AddRange(SpQueryArgs.FieldMappings.Select(fieldMapping => fieldMapping.Value.Name));
            }

            spView.Joins           = new JoinsCamlElement();
            spView.ProjectedFields = new ProjectedFieldsCamlElement();

            foreach (var dependentLookupField in SpQueryArgs.FieldMappings.Values.OfType <DependentLookupFieldAttribute>())
            {
                if (spView.ViewFields.Any(f => f.Name == dependentLookupField.Name))
                {
                    if (spView.ProjectedFields == null || !spView.ProjectedFields.Any(f => f.Name == dependentLookupField.Name))
                    {
                        spView.Joins.Join(new LeftJoin(dependentLookupField.LookupFieldName, dependentLookupField.List));
                        spView.ProjectedFields.ShowField(new CamlProjectedField(dependentLookupField.Name, dependentLookupField.List, dependentLookupField.ShowField));
                    }
                }
            }

            SpQueryArgs.OnBeforeEvent?.Invoke(spView);
        }