public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx) { var req = request as InitializeFromRequest; if (req == null) { throw new FaultException <OrganizationServiceFault>(new OrganizationServiceFault(), "Cannot execute InitializeFromRequest without the request"); } //TODO: Implement logic to filter mapping attributes based on the req.TargetFieldType if (req.TargetFieldType != TargetFieldType.All) { throw PullRequestException.PartiallyNotImplementedOrganizationRequest(req.GetType(), "logic for filtering attributes based on TargetFieldType other than All is missing"); } var service = ctx.GetOrganizationService(); var fetchXml = string.Format(FetchMappingsByEntity, req.EntityMoniker.LogicalName, req.TargetEntityName); var mapping = service.RetrieveMultiple(new FetchExpression(fetchXml)); var sourceAttributes = mapping.Entities.Select(a => a.GetAttributeValue <AliasedValue>("attributemap.sourceattributename").Value.ToString()).ToArray(); var columnSet = sourceAttributes.Length == 0 ? new ColumnSet(true) : new ColumnSet(sourceAttributes); var source = service.Retrieve(req.EntityMoniker.LogicalName, req.EntityMoniker.Id, columnSet); var entity = new Entity { LogicalName = req.TargetEntityName, Id = Guid.NewGuid() }; if (mapping.Entities.Count > 0) { foreach (var attr in source.Attributes) { var mappingEntity = mapping.Entities.FirstOrDefault(e => e.GetAttributeValue <AliasedValue>("attributemap.sourceattributename").Value.ToString() == attr.Key); if (mappingEntity == null) { continue; } var targetAttribute = mappingEntity.GetAttributeValue <AliasedValue>("attributemap.targetattributename").Value.ToString(); entity[targetAttribute] = attr.Value; } } var response = new InitializeFromResponse { Results = { ["Entity"] = entity } }; return(response); }
public static ConditionExpression ToConditionExpression(this XElement elem, XrmFakedContext ctx) { var conditionExpression = new ConditionExpression(); var conditionEntityName = ""; var attributeName = elem.GetAttribute("attribute").Value; ConditionOperator op = ConditionOperator.Equal; string value = null; if (elem.GetAttribute("value") != null) { value = elem.GetAttribute("value").Value; } if (elem.GetAttribute("entityname") != null) { conditionEntityName = elem.GetAttribute("entityname").Value; } switch (elem.GetAttribute("operator").Value) { case "eq": op = ConditionOperator.Equal; break; case "ne": case "neq": op = ConditionOperator.NotEqual; break; case "begins-with": op = ConditionOperator.BeginsWith; break; case "not-begin-with": op = ConditionOperator.DoesNotBeginWith; break; case "ends-with": op = ConditionOperator.EndsWith; break; case "not-end-with": op = ConditionOperator.DoesNotEndWith; break; case "in": op = ConditionOperator.In; break; case "not-in": op = ConditionOperator.NotIn; break; case "null": op = ConditionOperator.Null; break; case "not-null": op = ConditionOperator.NotNull; break; case "like": op = ConditionOperator.Like; if (value != null) { if (value.StartsWith("%") && !value.EndsWith("%")) { op = ConditionOperator.EndsWith; } else if (!value.StartsWith("%") && value.EndsWith("%")) { op = ConditionOperator.BeginsWith; } value = value.Replace("%", ""); } break; case "not-like": op = ConditionOperator.NotLike; if (value != null) { if (value.StartsWith("%") && !value.EndsWith("%")) { op = ConditionOperator.DoesNotEndWith; } else if (!value.StartsWith("%") && value.EndsWith("%")) { op = ConditionOperator.DoesNotBeginWith; } value = value.Replace("%", ""); } break; case "gt": op = ConditionOperator.GreaterThan; break; case "ge": op = ConditionOperator.GreaterEqual; break; case "lt": op = ConditionOperator.LessThan; break; case "le": op = ConditionOperator.LessEqual; break; case "on": op = ConditionOperator.On; break; case "on-or-before": op = ConditionOperator.OnOrBefore; break; case "on-or-after": op = ConditionOperator.OnOrAfter; break; case "today": op = ConditionOperator.Today; break; case "yesterday": op = ConditionOperator.Yesterday; break; case "tomorrow": op = ConditionOperator.Tomorrow; break; case "between": op = ConditionOperator.Between; break; case "not-between": op = ConditionOperator.NotBetween; break; case "eq-userid": op = ConditionOperator.EqualUserId; break; case "ne-userid": op = ConditionOperator.NotEqualUserId; break; default: throw PullRequestException.FetchXmlOperatorNotImplemented(elem.GetAttribute("operator").Value); } //Process values object[] values = null; var entityName = GetAssociatedEntityNameForConditionExpression(elem); //Find values inside the condition expression, if apply values = elem .Elements() //child nodes of this filter .Where(el => el.Name.LocalName.Equals("value")) .Select(el => el.ToValue(ctx, entityName, attributeName)) .ToArray(); //Otherwise, a single value was used if (value != null) { #if FAKE_XRM_EASY_2013 || FAKE_XRM_EASY_2015 || FAKE_XRM_EASY_2016 || FAKE_XRM_EASY_365 if (string.IsNullOrWhiteSpace(conditionEntityName)) { return(new ConditionExpression(attributeName, op, GetConditionExpressionValueCast(value, ctx, entityName, attributeName))); } else { return(new ConditionExpression(conditionEntityName, attributeName, op, GetConditionExpressionValueCast(value, ctx, entityName, attributeName))); } #else return(new ConditionExpression(attributeName, op, GetConditionExpressionValueCast(value, ctx, entityName, attributeName))); #endif } #if FAKE_XRM_EASY_2013 || FAKE_XRM_EASY_2015 || FAKE_XRM_EASY_2016 || FAKE_XRM_EASY_365 if (string.IsNullOrWhiteSpace(conditionEntityName)) { return(new ConditionExpression(attributeName, op, values)); } else { return(new ConditionExpression(conditionEntityName, attributeName, op, values)); } #else return(new ConditionExpression(attributeName, op, values)); #endif }
public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx) { var req = request as InitializeFromRequest; if (req == null) { throw new FaultException <OrganizationServiceFault>(new OrganizationServiceFault(), "Cannot execute InitializeFromRequest without the request"); } //TODO: Implement logic to filter mapping attributes based on the req.TargetFieldType if (req.TargetFieldType != TargetFieldType.All) { throw PullRequestException.PartiallyNotImplementedOrganizationRequest(req.GetType(), "logic for filtering attributes based on TargetFieldType other than All is missing"); } var service = ctx.GetOrganizationService(); var fetchXml = string.Format(FetchMappingsByEntity, req.EntityMoniker.LogicalName, req.TargetEntityName); var mapping = service.RetrieveMultiple(new FetchExpression(fetchXml)); var sourceAttributes = mapping.Entities.Select(a => a.GetAttributeValue <AliasedValue>("attributemap.sourceattributename").Value.ToString()).ToArray(); var columnSet = sourceAttributes.Length == 0 ? new ColumnSet(true) : new ColumnSet(sourceAttributes); var source = service.Retrieve(req.EntityMoniker.LogicalName, req.EntityMoniker.Id, columnSet); // If we are using proxy types, and the appropriate proxy type is found in // the assembly create an instance of the appropiate class // Othersise return a simple Entity Entity entity = new Entity { LogicalName = req.TargetEntityName, Id = Guid.Empty }; if (ctx.ProxyTypesAssembly != null) { var subClassType = ctx.FindReflectedType(req.TargetEntityName); if (subClassType != null) { var instance = Activator.CreateInstance(subClassType); entity = (Entity)instance; } } if (mapping.Entities.Count > 0) { foreach (var attr in source.Attributes) { var mappingEntity = mapping.Entities.FirstOrDefault(e => e.GetAttributeValue <AliasedValue>("attributemap.sourceattributename").Value.ToString() == attr.Key); if (mappingEntity == null) { continue; } var targetAttribute = mappingEntity.GetAttributeValue <AliasedValue>("attributemap.targetattributename").Value.ToString(); entity[targetAttribute] = attr.Value; var isEntityReference = string.Equals(attr.Key, source.LogicalName + "id", StringComparison.CurrentCultureIgnoreCase); if (isEntityReference) { entity[targetAttribute] = new EntityReference(source.LogicalName, (Guid)attr.Value); } else { entity[targetAttribute] = attr.Value; } } } var response = new InitializeFromResponse { Results = { ["Entity"] = entity } }; return(response); }
public OrganizationResponse Execute(OrganizationRequest req, XrmFakedContext ctx) { var request = req as RetrieveMultipleRequest; List <Entity> list = null; PagingInfo pageInfo = null; int? topCount = null; if (request.Query is QueryExpression) { var qe = request.Query as QueryExpression; pageInfo = qe.PageInfo; topCount = qe.TopCount; //need to request 1 extra to get a fill if there are more records if (topCount != null) { qe.TopCount = topCount + 1; } if (qe.PageInfo.Count > 0) { qe.TopCount = qe.PageInfo.Count + 1; } var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, request.Query as QueryExpression); list = linqQuery.ToList(); } else if (request.Query is FetchExpression) { var fetchXml = (request.Query as FetchExpression).Query; var xmlDoc = XrmFakedContext.ParseFetchXml(fetchXml); var queryExpression = XrmFakedContext.TranslateFetchXmlDocumentToQueryExpression(ctx, xmlDoc); pageInfo = queryExpression.PageInfo; topCount = queryExpression.TopCount; //need to request 1 extra to get a fill if there are more records if (topCount != null) { queryExpression.TopCount = topCount + 1; } if (queryExpression.PageInfo.Count > 0) { queryExpression.TopCount = queryExpression.PageInfo.Count + 1; } var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, queryExpression); list = linqQuery.ToList(); if (xmlDoc.IsAggregateFetchXml()) { list = XrmFakedContext.ProcessAggregateFetchXml(ctx, xmlDoc, list); } } else if (request.Query is QueryByAttribute) { //We instantiate a QueryExpression to be executed as we have the implementation done already var query = request.Query as QueryByAttribute; var qe = new QueryExpression(query.EntityName); qe.ColumnSet = query.ColumnSet; qe.Criteria = new FilterExpression(); for (var i = 0; i < query.Attributes.Count; i++) { qe.Criteria.AddCondition(new ConditionExpression(query.Attributes[i], ConditionOperator.Equal, query.Values[i])); } pageInfo = qe.PageInfo; topCount = qe.TopCount; //need to request 1 extra to be able check if there are more records if (topCount != null) { qe.TopCount = topCount + 1; } if (qe.PageInfo.Count > 0) { qe.TopCount = qe.PageInfo.Count + 1; } //QueryExpression now done... execute it! var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, qe as QueryExpression); list = linqQuery.ToList(); } else { throw PullRequestException.NotImplementedOrganizationRequest(request.Query.GetType()); } list.ForEach(e => e.ApplyDateBehaviour(ctx)); list.ForEach(e => PopulateFormattedValues(e)); var recordCount = list.Count(); var pageSize = recordCount; int pageNumber = 1; if (pageInfo != null && pageInfo.PageNumber > 0 && pageInfo.Count > 0) { pageSize = pageInfo.Count; pageNumber = pageInfo.PageNumber; } else if (topCount != null) { pageSize = topCount.Value; } var response = new RetrieveMultipleResponse { Results = new ParameterCollection { { "EntityCollection", new EntityCollection(list.Take(pageSize).ToList()) } } }; response.EntityCollection.MoreRecords = recordCount > pageSize; if (response.EntityCollection.MoreRecords) { var first = response.EntityCollection.Entities.First(); var last = response.EntityCollection.Entities.Last(); response.EntityCollection.PagingCookie = String.Format( "<cookie page=\"{0}\"><{1}id last=\"{2}\" first=\"{3}\" /></cookie>", pageNumber, first.LogicalName, last.Id.ToString("B").ToUpper(), first.Id.ToString("B").ToUpper()); } return(response); }
public OrganizationResponse Execute(OrganizationRequest request, XrmFakedContext ctx) { throw PullRequestException.NotImplementedOrganizationRequest(request.GetType()); }
public OrganizationResponse Execute(OrganizationRequest req, XrmFakedContext ctx) { var request = req as RetrieveMultipleRequest; List <Entity> list = null; PagingInfo pageInfo = null; QueryExpression qe; string entityName = null; if (request.Query is QueryExpression) { qe = (request.Query as QueryExpression).Clone(); entityName = qe.EntityName; var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, qe); list = linqQuery.ToList(); } else if (request.Query is FetchExpression) { var fetchXml = (request.Query as FetchExpression).Query; var xmlDoc = XrmFakedContext.ParseFetchXml(fetchXml); qe = XrmFakedContext.TranslateFetchXmlDocumentToQueryExpression(ctx, xmlDoc); entityName = qe.EntityName; var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, qe); list = linqQuery.ToList(); if (xmlDoc.IsAggregateFetchXml()) { list = XrmFakedContext.ProcessAggregateFetchXml(ctx, xmlDoc, list); } } else if (request.Query is QueryByAttribute) { // We instantiate a QueryExpression to be executed as we have the implementation done already var query = request.Query as QueryByAttribute; qe = new QueryExpression(query.EntityName); entityName = qe.EntityName; qe.ColumnSet = query.ColumnSet; qe.Criteria = new FilterExpression(); for (var i = 0; i < query.Attributes.Count; i++) { qe.Criteria.AddCondition(new ConditionExpression(query.Attributes[i], ConditionOperator.Equal, query.Values[i])); } qe.PageInfo = query.PageInfo; // QueryExpression now done... execute it! var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, qe); list = linqQuery.ToList(); } else { throw PullRequestException.NotImplementedOrganizationRequest(request.Query.GetType()); } if (qe.Distinct) { list = GetDistinctEntities(list); } // Handle the top count before taking paging into account if (qe.TopCount != null && qe.TopCount.Value < list.Count) { list = list.Take(qe.TopCount.Value).ToList(); } // Handle TotalRecordCount here? int totalRecordCount = -1; if (qe?.PageInfo?.ReturnTotalRecordCount == true) { totalRecordCount = list.Count; } // Handle paging var pageSize = ctx.MaxRetrieveCount; pageInfo = qe.PageInfo; int pageNumber = 1; if (pageInfo != null && pageInfo.PageNumber > 0) { pageNumber = pageInfo.PageNumber; pageSize = pageInfo.Count == 0 ? ctx.MaxRetrieveCount : pageInfo.Count; } // Figure out where in the list we need to start and how many items we need to grab int numberToGet = pageSize; int startPosition = 0; if (pageNumber != 1) { startPosition = (pageNumber - 1) * pageSize; } if (list.Count < pageSize) { numberToGet = list.Count; } else if (list.Count - pageSize * (pageNumber - 1) < pageSize) { numberToGet = list.Count - (pageSize * (pageNumber - 1)); } var recordsToReturn = startPosition + numberToGet > list.Count ? new List <Entity>() : list.GetRange(startPosition, numberToGet); recordsToReturn.ForEach(e => e.ApplyDateBehaviour(ctx)); recordsToReturn.ForEach(e => PopulateFormattedValues(e)); var response = new RetrieveMultipleResponse { Results = new ParameterCollection { { "EntityCollection", new EntityCollection(recordsToReturn) } } }; response.EntityCollection.EntityName = entityName; response.EntityCollection.MoreRecords = (list.Count - pageSize * pageNumber) > 0; response.EntityCollection.TotalRecordCount = totalRecordCount; if (response.EntityCollection.MoreRecords) { var first = response.EntityCollection.Entities.First(); var last = response.EntityCollection.Entities.Last(); response.EntityCollection.PagingCookie = $"<cookie page=\"{pageNumber}\"><{first.LogicalName}id last=\"{last.Id.ToString("B").ToUpper()}\" first=\"{first.Id.ToString("B").ToUpper()}\" /></cookie>"; } return(response); }
public OrganizationResponse Execute(OrganizationRequest req, XrmFakedContext ctx) { var request = req as RetrieveMultipleRequest; if (request.Query is QueryExpression) { var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, request.Query as QueryExpression); var list = linqQuery.ToList(); list.ForEach(e => PopulateFormattedValues(e)); var response = new RetrieveMultipleResponse { Results = new ParameterCollection { { "EntityCollection", new EntityCollection(list) } } }; return(response); } else if (request.Query is FetchExpression) { var fetchXml = (request.Query as FetchExpression).Query; var xmlDoc = XrmFakedContext.ParseFetchXml(fetchXml); var queryExpression = XrmFakedContext.TranslateFetchXmlDocumentToQueryExpression(ctx, xmlDoc); var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, queryExpression); var list = linqQuery.ToList(); if (xmlDoc.IsAggregateFetchXml()) { list = XrmFakedContext.ProcessAggregateFetchXml(ctx, xmlDoc, list); } list.ForEach(e => PopulateFormattedValues(e)); var response = new RetrieveMultipleResponse { Results = new ParameterCollection { { "EntityCollection", new EntityCollection(list) } } }; return(response); } else if (request.Query is QueryByAttribute) { //We instantiate a QueryExpression to be executed as we have the implementation done already var query = request.Query as QueryByAttribute; var qe = new QueryExpression(query.EntityName); qe.ColumnSet = query.ColumnSet; qe.Criteria = new FilterExpression(); for (var i = 0; i < query.Attributes.Count; i++) { qe.Criteria.AddCondition(new ConditionExpression(query.Attributes[i], ConditionOperator.Equal, query.Values[i])); } //QueryExpression now done... execute it! var linqQuery = XrmFakedContext.TranslateQueryExpressionToLinq(ctx, qe as QueryExpression); var list = linqQuery.ToList(); list.ForEach(e => PopulateFormattedValues(e)); var response = new RetrieveMultipleResponse { Results = new ParameterCollection { { "EntityCollection", new EntityCollection(list) } } }; return(response); } else { throw PullRequestException.NotImplementedOrganizationRequest(request.Query.GetType()); } }