Esempio n. 1
0
        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));
        }
Esempio n. 2
0
        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;
            }
        }