public override object Execute(Expression expression) { var resourceValue = _basePath.Substring(0, _basePath.LastIndexOf('/')); var translateResult = Translate(expression); var projector = translateResult.Projector.Compile(); var query = CreateCosmosQueryJson(translateResult.CommandText, null); var responses = HttpRequestHelper.GetResourceResult("post", _uri, _apiKey, _basePath, resourceValue, query, isQuery: true).Result; Type type = TypeSystemHelper.GetElementType(expression.Type); var list = (IList)Activator.CreateInstance(typeof(List <>).MakeGenericType(type)); var serializationType = typeof(IEnumerable <>).MakeGenericType(type); foreach (var response in responses) { if (response.StatusCode != HttpStatusCode.OK) { throw new CosmosQueryException(response.Body); } var cosmosQueryResponse = _serializer.Deserailize <CosmosQueryResponse>(response.Body); var items = _serializer.Deserialize(cosmosQueryResponse.Documents.ToString(), serializationType); foreach (var item in (ICollection)items) { list.Add(item); } } return(list); }
public IQueryable CreateQuery(Expression expression) { var elementType = TypeSystemHelper.GetElementType(expression.Type); try { return((IQueryable)Activator.CreateInstance(typeof(CosmosQueryable <>).MakeGenericType(elementType), new object[] { this, expression })); } catch (TargetInvocationException tie) { throw tie.InnerException; } }
/// <summary> /// Add the expression (x => _type == "Type.FullName" to the expression tree. /// </summary> /// <param name="expression"></param> /// <returns></returns> internal static Expression Inject(Expression expression) { var type = TypeSystemHelper.GetElementType(expression.Type); var targetExpression = Expression.Parameter(type, "x"); var namespaceExpression = Expression.Constant(type.FullName); var stellerTypeExpression = Expression.Constant("_type"); var equalExp = Expression.Equal(stellerTypeExpression, namespaceExpression); var queryableType = typeof(Queryable); var whereMethod = queryableType.GetMethods().First(m => { var parameters = m.GetParameters().ToList(); return(m.Name == "Where" && m.IsGenericMethodDefinition && parameters.Count == 2); }); var whereClause = Expression.Lambda(equalExp, new ParameterExpression[] { targetExpression }); var genericMethod = whereMethod.MakeGenericMethod(type); var exp = Expression.Call(genericMethod, expression, whereClause); return(exp); }