private bool TryHandleContains(SubQueryExpression subquery, ContainsResultOperator ro) { switch (subquery.QueryModel.MainFromClause.FromExpression) { case ConstantExpression expr: if (!(expr.Value is IList list)) { return(false); } CurrentExpression.Add("IN"); Visit(ro.Item); var opList = new List <object> { "[]" }; opList.AddRange(list.Cast <object>()); CurrentExpression.Add(opList); return(true); case MemberExpression expr: var last = _currentExpression; CurrentExpression.Add("ARRAY_CONTAINS()"); Visit(expr); Visit(ro.Item); _currentExpression = last; return(true); } return(false); }
protected override Expression VisitMember(MemberExpression node) { var sb = new StringBuilder(); var currentNode = (Expression)node; while (currentNode.NodeType == ExpressionType.MemberAccess || currentNode.NodeType == ExpressionType.Call) { if (currentNode.NodeType == ExpressionType.Call) { var ce = (currentNode as MethodCallExpression); if (ce.Method.Name != "get_Item") { return(base.VisitMember(node)); } var me = ce.Object as MemberExpression; var index = ((ConstantExpression)ce.Arguments[0]).Value; sb.Insert(0, $".{me.Member.Name}[{index}]"); currentNode = me.Expression; } else { var me = (currentNode as MemberExpression); var mappingProperty = me.Member.GetCustomAttribute(typeof(JsonPropertyAttribute)) as JsonPropertyAttribute; var name = mappingProperty?.PropertyName ?? me.Member.Name; sb.Insert(0, $".{name}"); currentNode = me.Expression; } } if (IncludeDbNames && currentNode is QuerySourceReferenceExpression sourceRef) { sb.Insert(0, $".{sourceRef.ReferencedQuerySource.ItemName}"); } if (_currentMode == Mode.AllOperator) { sb.Remove(0, 1); CurrentExpression.Add(new[] { "?X", sb.ToString() }); } else { CurrentExpression.Add(new[] { sb.ToString() }); } return(node); }
private void HandleSequence(MethodCallExpression expression) { CurrentExpression.Add(new[] { "._sequence" }); }
private void HandleId(MethodCallExpression expression) { CurrentExpression.Add(new[] { "._id" }); }