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(); } }
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); } }
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); }