示例#1
0
			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();
			}
示例#2
0
            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);
            }
示例#3
0
            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);
            }
示例#4
0
            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();
            }