protected RelativesExpression(Type type, Type ancestorType, Type descendentType, RelativesQueryDirection direction)
 {
     _type          = type;
     AncestorType   = ancestorType;
     DescendentType = descendentType;
     Direction      = direction;
 }
        private string GetQueryStringForRelativesOf(IEnumerable <int> ids, Type ancestorType, Type descendentType, RelativesQueryDirection direction, DateTime asOf)
        {
            var quotedDescendentIds = string.Join(", ", ids.Select(id => "'" + id + "'"));
            var queryString         = Constants.WORK_HIERARCHY_QUERY
                                      .Replace("#{{Ids}}", quotedDescendentIds)
                                      .Replace("#{{AncestorType}}", GetWorkItemType(ancestorType))
                                      .Replace("#{{DescendentType}}", GetWorkItemType(descendentType))
                                      .Replace("#{{Direction}}", direction == RelativesQueryDirection.AncestorFromDescendent ? "Target" : "Source")
                                      .Replace("#{{AsOf}}", asOf.ToUniversalTime().ToString("u"));

            return(queryString);
        }