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