public static void AddRequiredQueryJoins(this XrmService xrmService, QueryExpression query, string source) { var typeFieldPaths = xrmService.GetTypeFieldPath(source, query.EntityName); var splitOutFunction = source.Split(':'); if (splitOutFunction.Count() > 1) { source = splitOutFunction.ElementAt(1); } var splitTokens = source.Split('.'); if (typeFieldPaths.Count() == 1) { query.ColumnSet.AddColumn(typeFieldPaths.First().Value); } else { LinkEntity thisLink = null; for (var i = 0; i < typeFieldPaths.Count() - 1; i++) { var lookupField = typeFieldPaths.ElementAt(i).Value; var path = string.Join(".", splitTokens.Take(i + 1)).Replace("|", "_"); if (i == 0) { var targetType = typeFieldPaths.ElementAt(i + 1).Key; var matchingLinks = query.LinkEntities.Where(le => le.EntityAlias == path); if (matchingLinks.Any()) { thisLink = matchingLinks.First(); } else { thisLink = query.AddLink(targetType, lookupField, xrmService.GetPrimaryKeyField(targetType), JoinOperator.LeftOuter); thisLink.EntityAlias = path; thisLink.Columns = xrmService.CreateColumnSet(new string[0]); } } else { var targetType = xrmService.GetLookupTargetEntity(lookupField, thisLink.LinkToEntityName); var matchingLinks = thisLink.LinkEntities.Where(le => le.EntityAlias == path); if (matchingLinks.Any()) { thisLink = matchingLinks.First(); } else { thisLink = thisLink.AddLink(targetType, lookupField, xrmService.GetPrimaryKeyField(targetType), JoinOperator.LeftOuter); thisLink.EntityAlias = path; thisLink.Columns = xrmService.CreateColumnSet(new string[0]); } } } thisLink.Columns.AddColumn(typeFieldPaths.ElementAt(typeFieldPaths.Count() - 1).Value); } }
/// <summary> /// Returns list of key values giving the types and field name parsed for the given string of field joins /// key = type, value = field /// </summary> /// <param name="xrmService"></param> /// <param name="fieldPath"></param> /// <param name="sourceType"></param> /// <returns></returns> public static IEnumerable <KeyValuePair <string, string> > GetTypeFieldPath(this XrmService xrmService, string fieldPath, string sourceType) { var list = new List <KeyValuePair <string, string> >(); var splitOutFunction = fieldPath.Split(':'); if (splitOutFunction.Count() > 1) { fieldPath = splitOutFunction.ElementAt(1); } var split = fieldPath.Split('.'); var currentType = sourceType; list.Add(new KeyValuePair <string, string>(currentType, split.ElementAt(0).Split('|').First())); var i = 1; if (split.Length > 1) { foreach (var item in split.Skip(1).Take(split.Length - 1)) { var fieldName = item.Split('|').First(); if (split.ElementAt(i - 1).Contains("|")) { var targetType = split.ElementAt(i - 1).Split('|').Last(); list.Add(new KeyValuePair <string, string>(targetType, fieldName)); currentType = targetType; } else { var targetType = xrmService.GetLookupTargetEntity(list.ElementAt(i - 1).Value, currentType); list.Add(new KeyValuePair <string, string>(targetType, fieldName)); currentType = targetType; } i++; } } return(list); }
public void PopulateField(string field, Entity entity) { var type = entity.LogicalName; var fieldType = XrmService.GetFieldType(field, type); switch (fieldType) { case AttributeTypeCode.BigInt: { entity.SetField(field, 1); break; } case AttributeTypeCode.Boolean: { entity.SetField(field, true); break; } case AttributeTypeCode.CalendarRules: { break; } case AttributeTypeCode.Customer: { entity.SetField(field, CreateAccount()); break; } case AttributeTypeCode.DateTime: { var now = DateTime.UtcNow; var noMilliSeconds = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, DateTimeKind.Utc); entity.SetField(field, noMilliSeconds); break; } case AttributeTypeCode.Decimal: { entity.SetField(field, (decimal)1); break; } case AttributeTypeCode.Double: { entity.SetField(field, (double)1); break; } case AttributeTypeCode.EntityName: { break; } case AttributeTypeCode.Integer: { entity.SetField(field, 1); break; } case AttributeTypeCode.Lookup: { var target = XrmService.GetLookupTargetEntity(field, type); var typesToExlcude = new[] { "equipment", "transactioncurrency", "pricelevel", "service", "systemuser", "incident", "campaign", "territory" }; if (!typesToExlcude.Contains(target)) { entity.SetField(field, CreateTestRecord(target).ToEntityReference()); } break; } case AttributeTypeCode.ManagedProperty: { break; } case AttributeTypeCode.Memo: { entity.SetField(field, "blah blah blah \n blah"); break; } case AttributeTypeCode.Money: { entity.SetField(field, new Money(1)); break; } case AttributeTypeCode.Owner: { entity.SetField(field, new EntityReference("systemuser", CurrentUserId)); break; } case AttributeTypeCode.PartyList: { entity.AddActivityParty(field, "systemuser", CurrentUserId); break; } case AttributeTypeCode.Picklist: { entity.SetField(field, new OptionSetValue(XrmService.GetOptions(field, type).First().Key)); break; } case AttributeTypeCode.State: { break; } case AttributeTypeCode.Status: { break; } case AttributeTypeCode.String: { entity.SetField(field, "1234"); break; } case AttributeTypeCode.Uniqueidentifier: { break; } case AttributeTypeCode.Virtual: { break; } } }