Ejemplo n.º 1
0
        protected override Expression VisitMember(MemberExpression node)
        {
            if (node.Expression is ParameterExpression)
            {
                //访问到了根节点了
                if (_properties.Count <= 0)
                {
                    _columnInfos.Add(node.Member.Name, new KeyValuePair <string, string>(_masterTableName, node.Member.Name));
                }
                else
                {
                    Type type = node.Type;
                    if (type.IsGenericType)
                    {
                        type = Nullable.GetUnderlyingType(type);
                    }
                    if (!(type.FullName == "System.DateTime" && type.Assembly.GlobalAssemblyCache))
                    {
                        throw new ArgumentException("Select子句中多个属性访问的表达式时,若属性名为Date,则只能支持访问DateTime类型的实体,例如x.Time.Date");
                    }

                    NeedWrapSelect = true;
                    _columnInfos.Add(node.Member.Name, new KeyValuePair <string, string>(_masterTableName, node.Member.Name));
                    _columnMethods.Add(new KeyValuePair <string, string>(_masterTableName, node.Member.Name), "CONVERT(NVARCHAR(20),{0},101)");
                    if (!_tableInfos.ContainsKey(_masterTableName))
                    {
                        _tableInfos.Add(_masterTableName, ExpressionUtil.GenerateRandomTableAlias());
                    }
                    _properties.Clear();
                }
            }
            else
            {
                //不是根节点,取出Member属性用于计算值
                PropertyInfo propertyInfo = (PropertyInfo)node.Member;
                if (propertyInfo.Name == "Value")
                {
                    propertyInfo = (PropertyInfo)((MemberExpression)node.Expression).Member;
                    //跳过可空类型
                    if (!propertyInfo.PropertyType.IsGenericType)
                    {
                        throw new ArgumentException("在Select子句中,若使用了多个属性访问的表达式并且属性名为Value,则该表达式只允许为访问Nullable<T>的表达式,例如如果实体的Time为DateTime?,则可以写为x.Time.Value");
                    }
                    else
                    {
                        return(base.VisitMember(node));
                    }
                }
                NeedWrapSelect = true;
                _properties.Push(propertyInfo);
            }
            return(base.VisitMember(node));
        }
Ejemplo n.º 2
0
        protected override Expression VisitNew(NewExpression node)
        {
            //此处一般是在Select方法中new了匿名对象,例如users.Select(x=>new {x.Id})
            foreach (System.Reflection.MemberInfo memberInfo in node.Members)
            {
                //检查当前成员的类型是否是实体类型,例如x=>new {x.User.Book.Id}
                //这种情况一般是外键访问,需要考虑与主表之间的关系

                if (ExpressionUtil.IsEntityMember(memberInfo))
                {
                    //当前成员的类型是一个实体类型,需要考虑与主表的关系
                    var type             = ExpressionUtil.GetMemberType(memberInfo);
                    var entityInfo       = _entityManager.GetEntity(type);
                    var parentExpression = FindArgument(node.Arguments, memberInfo);
                    if (parentExpression is ParameterExpression)
                    {
                        //该成员由参数直接调用,可直接考虑与主表的关系
                    }
                    string tableName = entityInfo.TableName;
                    //if (string.IsNullOrWhiteSpace(tableName))
                    //{
                    //    throw new Exception("Select子句中选择的类型没有标TableAttribute特性或者特性中指定了空表名");
                    //}

                    var pis = entityInfo.Properties;
                    //_alias.AddRange(pis.Select(x => x.Name));
                    foreach (var propertyInfo in pis)
                    {
                        _columnInfos.Add(propertyInfo.Name, new KeyValuePair <string, string>(tableName, propertyInfo.Name));
                    }
                    if (!_tableInfos.ContainsKey(tableName))
                    {
                        _tableInfos.Add(tableName, ExpressionUtil.GenerateRandomTableAlias());
                    }
                }
                else
                {
                    _columnInfos.Add(memberInfo.Name, new KeyValuePair <string, string>(_masterTableName, memberInfo.Name));
                }
            }
            return(node);
        }