Beispiel #1
0
        public static int Delete(DbManager dataContext, T obj)
        {
            if (Equals(default(T), obj))
            {
                return(0);
            }

            ExpressionInfo <int> ei;

            var key = new { dataContext.MappingSchema, dataContext.DataProvider };

            if (!ObjectOperation <T> .Delete.TryGetValue(key, out ei))
            {
                lock (_sync)
                    if (!ObjectOperation <T> .Delete.TryGetValue(key, out ei))
                    {
                        var sqlTable = new SqlTable <T>(dataContext.MappingSchema);
                        var sqlQuery = new SqlQuery {
                            QueryType = QueryType.Delete
                        };

                        sqlQuery.From.Table(sqlTable);

                        ei = new ExpressionInfo <int>
                        {
                            MappingSchema = dataContext.MappingSchema,
                            DataProvider  = dataContext.DataProvider,
                            Queries       = { new ExpressionInfo <int> .QueryInfo {
                                                  SqlQuery = sqlQuery,
                                              } }
                        };

                        var keys = sqlTable.GetKeys(true).Cast <SqlField>().ToList();

                        if (keys.Count == 0)
                        {
                            throw new LinqException(
                                      string.Format("Table '{0}' does not have primary key.", sqlTable.Name));
                        }

                        foreach (var field in keys)
                        {
                            var param = GetParameter <int>(dataContext, field);

                            ei.Queries[0].Parameters.Add(param);

                            sqlQuery.Where.Field(field).Equal.Expr(param.SqlParameter);
                        }

                        ei.SetNonQueryQuery();

                        ObjectOperation <T> .Delete.Add(key, ei);
                    }
            }

            return((int)ei.GetElement(null, dataContext, Expression.Constant(obj), null));
        }
Beispiel #2
0
        public static int Insert(DbManager dataContext, T obj)
        {
            if (Equals(default(T), obj))
            {
                return(0);
            }

            ExpressionInfo <int> ei;

            var key = new { dataContext.MappingSchema, dataContext.DataProvider };

            if (!ObjectOperation <T> .Insert.TryGetValue(key, out ei))
            {
                lock (_sync)
                    if (!ObjectOperation <T> .Insert.TryGetValue(key, out ei))
                    {
                        var sqlTable = new SqlTable <T>(dataContext.MappingSchema);
                        var sqlQuery = new SqlQuery {
                            QueryType = QueryType.Insert
                        };

                        sqlQuery.Set.Into = sqlTable;

                        ei = new ExpressionInfo <int>
                        {
                            MappingSchema = dataContext.MappingSchema,
                            DataProvider  = dataContext.DataProvider,
                            Queries       = { new ExpressionInfo <int> .QueryInfo {
                                                  SqlQuery = sqlQuery,
                                              } }
                        };

                        foreach (var field in sqlTable.Fields)
                        {
                            if (field.Value.IsInsertable)
                            {
                                var param = GetParameter <int>(dataContext, field.Value);

                                ei.Queries[0].Parameters.Add(param);

                                sqlQuery.Set.Items.Add(new SqlQuery.SetExpression(field.Value, param.SqlParameter));
                            }
                        }

                        ei.SetNonQueryQuery();

                        ObjectOperation <T> .Insert.Add(key, ei);
                    }
            }

            return((int)ei.GetElement(null, dataContext, Expression.Constant(obj), null));
        }