protected ICondition ConvertToConditions(Expression expression) { var _expression = expression as BinaryExpression; if (expression.NodeType == ExpressionType.AndAlso) { return(new Conditions(ConvertToConditions(_expression.Left)) .And(ConvertToConditions(((BinaryExpression)expression).Right))); } if (expression.NodeType == ExpressionType.OrElse) { return(new Conditions(ConvertToConditions(_expression.Left)) .Or(ConvertToConditions(((BinaryExpression)expression).Right))); } ISqlExpression left = null; ISqlExpression right = null; #region Left Evaluation if (_expression.Left.NodeType == ExpressionType.MemberAccess) { var leftExp = _expression.Left as MemberExpression; if (leftExp.Expression != null) { var column = _metadata.Columns.FirstOrDefault(x => x.Name == leftExp.Member.Name); var colName = _metadata.TableAlias + "." + column.ColumnName; left = new SqlColumnName(colName, column.ColumnName); } else if (leftExp.Member.DeclaringType == typeof(DateTime)) { left = new SqlDateTime(Convert.ToDateTime(ReflectionUtils.GetMemberValue(leftExp.Member, null))); } else if (leftExp.Member.DeclaringType == typeof(bool)) { left = new SqlNumber(Convert.ToBoolean(ReflectionUtils.GetMemberValue(leftExp.Member, null)) ? 1 : 0); } else { left = new SqlString(ReflectionUtils.GetMemberValue(leftExp.Member, null).ToString()); } } else if (_expression.Left.NodeType == ExpressionType.Constant) { var constant = _expression.Left as ConstantExpression; if (constant.Type == typeof(bool)) { left = new SqlBoolean((bool)constant.Value); } else { left = new SqlString(constant.Value.ToString()); } } #endregion #region Right Evaluation if (_expression.Right.NodeType == ExpressionType.MemberAccess) { var rightExp = _expression.Right as MemberExpression; if (rightExp.Expression != null) { var column = _metadata.Columns.FirstOrDefault(x => x.Name == rightExp.Member.Name); var colName = _metadata.TableAlias + "." + column.ColumnName; right = new SqlColumnName(colName, column.ColumnName); } else if (rightExp.Member.DeclaringType == typeof(DateTime)) { right = new SqlDateTime(Convert.ToDateTime(ReflectionUtils.GetMemberValue(rightExp.Member, null))); } else if (rightExp.Member.DeclaringType == typeof(bool)) { right = new SqlNumber(Convert.ToBoolean(ReflectionUtils.GetMemberValue(rightExp.Member, null)) ? 1 : 0); } else { right = new SqlString(ReflectionUtils.GetMemberValue(rightExp.Member, null).ToString()); } } else if (_expression.Right.NodeType == ExpressionType.Constant) { var constant = _expression.Right as ConstantExpression; if (constant.Type == typeof(bool)) { right = new SqlBoolean((bool)constant.Value); } else { right = new SqlString(constant.Value.ToString()); } } #endregion return(new Condition(left, GetComparisonOperator(_expression), right)); }
private void AddDataTable(string table_name, string table_alias, IMapping mapping) { if (this.Tables.Contains(table_alias)) { return; } var table = new DataTable(table_alias); var keys = new List <DataColumn>(); this.Tables.Add(table); var columns = table.Columns; var select = (new SelectStatement()).From(table_name, "t0"); table.ExtendedProperties["Storage"] = table_name; foreach (var item in mapping.Columns) { if (IgnoreMemoFields && item.IsMemo) { continue; } var pinfo = (PropertyInfo)item.Property; DataColumn column; if (pinfo.PropertyType.IsGenericType && pinfo.PropertyType.GetGenericTypeDefinition() == typeof(Nullable <>)) { column = columns.Add(item.Name, pinfo.PropertyType.GetGenericArguments()[0]); } else if (pinfo.PropertyType.IsEnum) { column = columns.Add(item.Name, typeof(string)); } else { column = columns.Add(item.Name, pinfo.PropertyType); } select.Column(new SqlColumnName("t0", item.ColumnName), item.Name); if (item.IsDbGenerated) { column.AutoIncrement = true; column.AutoIncrementSeed = 1; column.AutoIncrementStep = 1; column.Unique = true; } if (item.IsPrimaryKey) { column.ExtendedProperties["PrimaryKey"] = true; keys.Add(column); } column.AllowDBNull = item.IsNullable; //if (item.IsNullable && item.DefaultValue != null) // column.DefaultValue = item.DefaultValue; if (!item.IsDbGenerated) { if (item.DefaultFunctionValue == null) { column.DefaultValue = item.DefaultValue; } else { column.DefaultValue = item.DefaultFunctionValue(); } } column.ExtendedProperties["Storage"] = item.ColumnName; if (item.IsMemo) { column.ExtendedProperties["Memo"] = true; } } table.ExtendedProperties["SelectStatement"] = select; if (keys.Count > 0) { table.PrimaryKey = keys.ToArray(); } /* Procedimiento para añadir las columnas descriptivas de las columnas foreanas */ var items = mapping.Associations.Where(x => x.GetType().Name == "MakeReferenceToMapping`2" || x.GetType().Name == "HasOneMapping`2"); if (items.Count() == 0) { return; } //Debes poner las otras columnas con el nombre fisico alias el nombre de la propiedad int t = 1; string tp = "t" + t; foreach (var item in items) { var omapping = MappingFactory.GetMapping(item.OtherMappingType); // extra columns for criteria support for (var x = 0; x < omapping.Columns.Count; x++) { var col = omapping.Columns[x]; select.Column(new SqlColumnName(tp, col.ColumnName), item.Name + "." + col.Name); } /* build joins */ //for (var k = 0; k < item.ThisKeys.Count; k++ ) //{ var keyName = item.ThisKeys[0]; var otherKeyName = item.OtherKeys[0]; var tcol = mapping.Columns.Where(x => x.Name == keyName).Single(); var ocol = omapping.Columns.Where(x => x.Name == otherKeyName).Single(); if (tcol.IsNullable || item.GetType().Name == "HasOneMapping`2") { select.LeftJoin(omapping.TableName, tp, Condition.IsEqual(new SqlColumnName("t0", tcol.ColumnName), new SqlColumnName(tp, ocol.ColumnName))); } else { select.InnerJoin(omapping.TableName, tp, Condition.IsEqual(new SqlColumnName("t0", tcol.ColumnName), new SqlColumnName(tp, ocol.ColumnName))); } //} /* build foreign row name */ var lblCount = item.OtherLabels.Count; if (lblCount > 0) { var lbl0 = item.OtherLabels[0]; //var colName = omapping.Columns.Where(x => x.Name == lbl0).Single().ColumnName; ISqlExpression lblExpr; if (lblCount == 1) { lblExpr = new SqlColumnName(item.Name + "." + item.OtherLabels[0]); } else { var lblConcat = new ConcatFunction(" | "); foreach (var lbl in item.OtherLabels) { lblConcat.Append(new SqlColumnName(item.Name, lbl)); } lblExpr = lblConcat; } var column = columns.Add(item.Name, typeof(string)); column.ExtendedProperties["SelectExpression"] = lblExpr; column.ExtendedProperties["NonStorable"] = true; } // Include OtherColumns in DataTable foreach (string ocn in item.OtherColumns) { var column = columns.Add(omapping.EntityName + "." + ocn, typeof(string)); column.ExtendedProperties["NonStorable"] = true; } t++; tp = "t" + t; } }