public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags) { if (expression == null) return _key.ConvertToSql(null, 0, flags); if (level > 0) { switch (expression.NodeType) { case ExpressionType.Call : { var e = (MethodCallExpression)expression; if (e.Method.DeclaringType == typeof(Enumerable)) { return new[] { new SqlInfo { Sql = ParseEnumerable(e) } }; } break; } case ExpressionType.MemberAccess : { if (level != 0) { var levelExpression = expression.GetLevelExpression(level); if (levelExpression.NodeType == ExpressionType.MemberAccess) { var e = (MemberExpression)levelExpression; if (e.Member.Name == "Key") { if (_keyProperty == null) _keyProperty = _groupingType.GetProperty("Key"); if (e.Member == _keyProperty) { if (levelExpression == expression) return _key.ConvertToSql(null, 0, flags); return _key.ConvertToSql(expression, level + 1, flags); } } } } break; } } } throw new NotImplementedException(); }
public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags) { if (expression == null) { return(_key.ConvertToSql(null, 0, flags)); } if (level > 0) { switch (expression.NodeType) { case ExpressionType.Call: { var e = (MethodCallExpression)expression; if (e.IsQueryable() || e.IsAggregate(Builder.MappingSchema)) { return(new[] { new SqlInfo { Sql = ConvertEnumerable(e) } }); } break; } case ExpressionType.MemberAccess: { var levelExpression = expression.GetLevelExpression(Builder.MappingSchema, level); if (levelExpression.NodeType == ExpressionType.MemberAccess) { var e = (MemberExpression)levelExpression; if (e.Member.Name == "Key") { if (_keyProperty == null) { _keyProperty = _groupingType.GetPropertyEx("Key"); } if (e.Member == _keyProperty) { if (ReferenceEquals(levelExpression, expression)) { return(_key.ConvertToSql(null, 0, flags)); } return(_key.ConvertToSql(expression, level + 1, flags)); } } return(Sequence.ConvertToSql(expression, level, flags)); } break; } } } throw new LinqException("Expression '{0}' cannot be converted to SQL.", expression); }
public override SqlInfo[] ConvertToSql(Expression?expression, int level, ConvertFlags flags) { if (expression == null) { if (flags == ConvertFlags.Field && !_key.IsScalar) { return(Element.ConvertToSql(null, 0, flags)); } var keys = _key.ConvertToSql(null, 0, flags); for (var i = 0; i < keys.Length; i++) { var key = keys[i]; keys[i] = key.AppendMember(_keyProperty !); } return(keys); } if (level == 0 && expression.NodeType == ExpressionType.MemberAccess) { level += 1; } if (level > 0) { switch (expression.NodeType) { case ExpressionType.Call: { var e = (MethodCallExpression)expression; if (e.IsQueryable() || e.IsAggregate(Builder.MappingSchema)) { return(new[] { new SqlInfo(ConvertEnumerable(e)) }); } break; } case ExpressionType.MemberAccess: { var levelExpression = expression.GetLevelExpression(Builder.MappingSchema, level); if (levelExpression.NodeType == ExpressionType.MemberAccess) { var e = (MemberExpression)levelExpression; if (e.Member.Name == "Key") { if (_keyProperty == null) { _keyProperty = _groupingType.GetProperty("Key"); } if (e.Member == _keyProperty) { if (ReferenceEquals(levelExpression, expression)) { return(_key.ConvertToSql(null, 0, flags)); } return(_key.ConvertToSql(expression, level + 1, flags)); } } return(Sequence.ConvertToSql(expression, level, flags)); } break; } } } throw new LinqException("Expression '{0}' cannot be converted to SQL.", expression); }
public override SqlInfo[] ConvertToSql(Expression expression, int level, ConvertFlags flags) { if (expression == null) { return(_key.ConvertToSql(null, 0, flags)); } if (level > 0) { switch (expression.NodeType) { case ExpressionType.Call: { var e = (MethodCallExpression)expression; if (e.Method.DeclaringType == typeof(Enumerable)) { return(new[] { new SqlInfo { Sql = ConvertEnumerable(e) } }); } break; } case ExpressionType.MemberAccess: { var levelExpression = expression.GetLevelExpression(level); if (levelExpression.NodeType == ExpressionType.MemberAccess) { var e = (MemberExpression)levelExpression; if (e.Member.Name == "Key") { if (_keyProperty == null) { _keyProperty = _groupingType.GetProperty("Key"); } if (e.Member == _keyProperty) { if (levelExpression == expression) { return(_key.ConvertToSql(null, 0, flags)); } return(_key.ConvertToSql(expression, level + 1, flags)); } } return(Sequence.ConvertToSql(expression, level, flags)); } break; } } } throw new InvalidOperationException(); }