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)); }
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); }