|  | @@ -5,56 +5,50 @@ using System.Linq;
 | 
		
	
		
			
			| 5 | 5 |  using System.Linq.Expressions;
 | 
		
	
		
			
			| 6 | 6 |  using iiie.Logs.DataAccess;
 | 
		
	
		
			
			| 7 | 7 |  using iiie.Logs.DBO;
 | 
		
	
		
			
			| 8 |  | -using System.Linq.Dynamic;
 | 
		
	
		
			
			| 9 | 8 |  
 | 
		
	
		
			
			| 10 | 9 |  namespace iiie.WebApiUtils.BusinessManager
 | 
		
	
		
			
			| 11 | 10 |  {
 | 
		
	
		
			
			| 12 | 11 |      /// <summary>
 | 
		
	
		
			
			| 13 | 12 |      /// Helper for SQL Server data access
 | 
		
	
		
			
			| 14 | 13 |      /// </summary>
 | 
		
	
		
			
			| 15 |  | -    public abstract class SqlServerManager<TDbObject, TDbo, TEntities, TThis>
 | 
		
	
		
			
			|  | 14 | +    public abstract class SqlServerManager<TDbObject, TDboGet, TDboAdd, TDboEdit, TEntities, TThis>
 | 
		
	
		
			
			|  | 15 | +        : SqlServerBasicManager<TDbObject, TEntities, TThis>
 | 
		
	
		
			
			| 16 | 16 |          where TDbObject : class
 | 
		
	
		
			
			| 17 | 17 |          where TEntities : DbContext, new()
 | 
		
	
		
			
			| 18 |  | -        where TThis : SqlServerManager<TDbObject, TDbo, TEntities, TThis>,  new()
 | 
		
	
		
			
			|  | 18 | +        where TThis : SqlServerManager<TDbObject, TDboGet, TDboAdd, TDboEdit, TEntities, TThis>, new()
 | 
		
	
		
			
			| 19 | 19 |      {
 | 
		
	
		
			
			| 20 |  | -        private class DbObjectId
 | 
		
	
		
			
			| 21 |  | -        {
 | 
		
	
		
			
			| 22 |  | -            public long id { get; set; }
 | 
		
	
		
			
			| 23 |  | -        }
 | 
		
	
		
			
			| 24 | 20 |  
 | 
		
	
		
			
			| 25 | 21 |          /// <summary>
 | 
		
	
		
			
			| 26 |  | -        /// Return the table to be used
 | 
		
	
		
			
			|  | 22 | +        /// Convert a DB object to DBO
 | 
		
	
		
			
			| 27 | 23 |          /// </summary>
 | 
		
	
		
			
			| 28 |  | -        /// <param name="db">The database</param>
 | 
		
	
		
			
			| 29 |  | -        /// <returns>The table instance</returns>
 | 
		
	
		
			
			| 30 |  | -        public abstract DbSet<TDbObject> GetTable(TEntities db);
 | 
		
	
		
			
			| 31 |  | -
 | 
		
	
		
			
			| 32 |  | -        public abstract TDbo DbToDbo(TDbObject obj);
 | 
		
	
		
			
			|  | 24 | +        /// <param name="obj">The object to be converted</param>
 | 
		
	
		
			
			|  | 25 | +        /// <returns>The DBO</returns>
 | 
		
	
		
			
			|  | 26 | +        public abstract TDboGet DbToDboGet(TDbObject obj);
 | 
		
	
		
			
			| 33 | 27 |  
 | 
		
	
		
			
			| 34 |  | -        public abstract TDbObject DboToDb(TDbo obj);
 | 
		
	
		
			
			|  | 28 | +        /// <summary>
 | 
		
	
		
			
			|  | 29 | +        /// Convert a DBO to DB object
 | 
		
	
		
			
			|  | 30 | +        /// </summary>
 | 
		
	
		
			
			|  | 31 | +        /// <param name="obj">The object to be converted</param>
 | 
		
	
		
			
			|  | 32 | +        /// <returns>The DB object</returns>
 | 
		
	
		
			
			|  | 33 | +        public abstract TDbObject DboAddToDb(TDboAdd obj);
 | 
		
	
		
			
			| 35 | 34 |  
 | 
		
	
		
			
			| 36 | 35 |          /// <summary>
 | 
		
	
		
			
			| 37 |  | -        /// Return the database table to use
 | 
		
	
		
			
			|  | 36 | +        /// Convert a DBO to DB object
 | 
		
	
		
			
			| 38 | 37 |          /// </summary>
 | 
		
	
		
			
			| 39 |  | -        /// <param name="db">The database instance</param>
 | 
		
	
		
			
			| 40 |  | -        /// <returns>The table</returns>
 | 
		
	
		
			
			| 41 |  | -        public static DbSet<TDbObject> GetTableStatic(TEntities db)
 | 
		
	
		
			
			| 42 |  | -        {
 | 
		
	
		
			
			| 43 |  | -            var type = new TThis();
 | 
		
	
		
			
			| 44 |  | -            return type.GetTable(db);
 | 
		
	
		
			
			| 45 |  | -        }
 | 
		
	
		
			
			|  | 38 | +        /// <param name="obj">The object to be converted</param>
 | 
		
	
		
			
			|  | 39 | +        /// <param name="edit">The object beeing edited</param>
 | 
		
	
		
			
			|  | 40 | +        /// <returns>The DB object</returns>
 | 
		
	
		
			
			|  | 41 | +        public abstract TDbObject DboEditToDb(TDboEdit obj, TDbObject edit);
 | 
		
	
		
			
			| 46 | 42 |  
 | 
		
	
		
			
			| 47 | 43 |          /// <summary>
 | 
		
	
		
			
			| 48 | 44 |          /// Helper to convert DB object to DBO
 | 
		
	
		
			
			| 49 | 45 |          /// </summary>
 | 
		
	
		
			
			| 50 | 46 |          /// <param name="res">The result to convert</param>
 | 
		
	
		
			
			| 51 | 47 |          /// <returns>The DBO object</returns>
 | 
		
	
		
			
			| 52 |  | -        public static OpResult<TDbo> DbToDboStatic(OpResult<TDbObject> res)
 | 
		
	
		
			
			|  | 48 | +        public static TDboGet DbToDboGetStatic(TDbObject res)
 | 
		
	
		
			
			| 53 | 49 |          {
 | 
		
	
		
			
			| 54 |  | -            if (!res)
 | 
		
	
		
			
			| 55 |  | -                return OpResult<TDbo>.Error(res);
 | 
		
	
		
			
			| 56 | 50 |              var obj = new TThis();
 | 
		
	
		
			
			| 57 |  | -            return OpResult<TDbo>.Ok(obj.DbToDbo(res.Data));
 | 
		
	
		
			
			|  | 51 | +            return obj.DbToDboGet(res);
 | 
		
	
		
			
			| 58 | 52 |          }
 | 
		
	
		
			
			| 59 | 53 |          
 | 
		
	
		
			
			| 60 | 54 |          /// <summary>
 | 
		
	
	
		
			
			|  | @@ -62,109 +56,106 @@ namespace iiie.WebApiUtils.BusinessManager
 | 
		
	
		
			
			| 62 | 56 |          /// </summary>
 | 
		
	
		
			
			| 63 | 57 |          /// <param name="res">The result to convert</param>
 | 
		
	
		
			
			| 64 | 58 |          /// <returns>The DB object</returns>
 | 
		
	
		
			
			| 65 |  | -        public static OpResult<TDbObject> DboToDbStatic(OpResult<TDbo> res)
 | 
		
	
		
			
			|  | 59 | +        public static TDbObject DboAddToDbStatic(TDboAdd res)
 | 
		
	
		
			
			| 66 | 60 |          {
 | 
		
	
		
			
			| 67 |  | -            if (!res)
 | 
		
	
		
			
			| 68 |  | -                return OpResult<TDbObject>.Error(res);
 | 
		
	
		
			
			| 69 | 61 |              var obj = new TThis();
 | 
		
	
		
			
			| 70 |  | -            return OpResult<TDbObject>.Ok(obj.DboToDb(res.Data));
 | 
		
	
		
			
			|  | 62 | +            return obj.DboAddToDb(res);
 | 
		
	
		
			
			| 71 | 63 |          }
 | 
		
	
		
			
			| 72 | 64 |  
 | 
		
	
		
			
			| 73 |  | -        /// <summary>
 | 
		
	
		
			
			| 74 |  | -        /// Helper to convert DB object to DBO
 | 
		
	
		
			
			| 75 |  | -        /// </summary>
 | 
		
	
		
			
			| 76 |  | -        /// <param name="res">The result to convert</param>
 | 
		
	
		
			
			| 77 |  | -        /// <returns>The DBO object</returns>
 | 
		
	
		
			
			| 78 |  | -        public static TDbo DbToDboStatic(TDbObject res)
 | 
		
	
		
			
			| 79 |  | -        {
 | 
		
	
		
			
			| 80 |  | -            var obj = new TThis();
 | 
		
	
		
			
			| 81 |  | -            return obj.DbToDbo(res);
 | 
		
	
		
			
			| 82 |  | -        }
 | 
		
	
		
			
			| 83 |  | -        
 | 
		
	
		
			
			| 84 | 65 |          /// <summary>
 | 
		
	
		
			
			| 85 | 66 |          /// Helper to convert DBO object to DB
 | 
		
	
		
			
			| 86 | 67 |          /// </summary>
 | 
		
	
		
			
			| 87 | 68 |          /// <param name="res">The result to convert</param>
 | 
		
	
		
			
			|  | 69 | +        /// <param name="edit">The object beeing edited</param>
 | 
		
	
		
			
			| 88 | 70 |          /// <returns>The DB object</returns>
 | 
		
	
		
			
			| 89 |  | -        public static TDbObject DboToDbStatic(TDbo res)
 | 
		
	
		
			
			|  | 71 | +        public static TDbObject DboEditToDbStatic(TDboEdit res, TDbObject edit)
 | 
		
	
		
			
			| 90 | 72 |          {
 | 
		
	
		
			
			| 91 | 73 |              var obj = new TThis();
 | 
		
	
		
			
			| 92 |  | -            return obj.DboToDb(res);
 | 
		
	
		
			
			|  | 74 | +            return obj.DboEditToDb(res, edit);
 | 
		
	
		
			
			| 93 | 75 |          }
 | 
		
	
		
			
			| 94 | 76 |  
 | 
		
	
		
			
			| 95 | 77 |          /// <summary>
 | 
		
	
		
			
			| 96 |  | -        /// Execute SQL quries in try catch
 | 
		
	
		
			
			|  | 78 | +        /// Get a single DB object matching the predicate
 | 
		
	
		
			
			| 97 | 79 |          /// </summary>
 | 
		
	
		
			
			| 98 |  | -        /// <param name="func">The queries to be performed</param>
 | 
		
	
		
			
			| 99 |  | -        /// <returns>The result or an error</returns>
 | 
		
	
		
			
			| 100 |  | -        public static OpResult<U> Execute<U>(Func<TEntities, DbSet<TDbObject>, OpResult<U>> func)
 | 
		
	
		
			
			|  | 80 | +        /// <param name="table">The table to search in</param>
 | 
		
	
		
			
			|  | 81 | +        /// <param name="predicate">The predicate</param>
 | 
		
	
		
			
			|  | 82 | +        /// <returns>The object that match</returns>
 | 
		
	
		
			
			|  | 83 | +        public static OpResult<TDbObject> GetSingleDbObject(DbSet<TDbObject> table, Expression<Func<TDbObject, bool>> predicate)
 | 
		
	
		
			
			| 101 | 84 |          {
 | 
		
	
		
			
			| 102 |  | -            try
 | 
		
	
		
			
			|  | 85 | +            var o = table.FirstOrDefault(predicate);
 | 
		
	
		
			
			|  | 86 | +            if (o == null)
 | 
		
	
		
			
			| 103 | 87 |              {
 | 
		
	
		
			
			| 104 |  | -                using (var db = new TEntities())
 | 
		
	
		
			
			| 105 |  | -                {
 | 
		
	
		
			
			| 106 |  | -                    var table = GetTableStatic(db);
 | 
		
	
		
			
			| 107 |  | -                    return func(db, table);
 | 
		
	
		
			
			| 108 |  | -                }
 | 
		
	
		
			
			| 109 |  | -            }
 | 
		
	
		
			
			| 110 |  | -            catch (Exception e)
 | 
		
	
		
			
			| 111 |  | -            {
 | 
		
	
		
			
			| 112 |  | -                return Logger.Error<U>(ResultStatus.DBError, e);
 | 
		
	
		
			
			|  | 88 | +                return OpResult<TDbObject>.Error(ResultStatus.NotFound, typeof(TThis).Name + ": Value not found", "");
 | 
		
	
		
			
			| 113 | 89 |              }
 | 
		
	
		
			
			|  | 90 | +            return OpResult<TDbObject>.Ok(o);
 | 
		
	
		
			
			| 114 | 91 |          }
 | 
		
	
		
			
			| 115 | 92 |  
 | 
		
	
		
			
			| 116 | 93 |          /// <summary>
 | 
		
	
		
			
			| 117 |  | -        /// Get a single DB object matching the predicate
 | 
		
	
		
			
			|  | 94 | +        /// Get a single DBO matching the predicate
 | 
		
	
		
			
			| 118 | 95 |          /// </summary>
 | 
		
	
		
			
			| 119 | 96 |          /// <param name="predicate">The predicate</param>
 | 
		
	
		
			
			| 120 | 97 |          /// <returns>The object that match, or null</returns>
 | 
		
	
		
			
			| 121 |  | -        public static OpResult<TDbObject> GetSingle(Expression<Func<TDbObject, bool>> predicate)
 | 
		
	
		
			
			|  | 98 | +        public static OpResult<TDboGet> GetSingle(Expression<Func<TDbObject, bool>> predicate)
 | 
		
	
		
			
			| 122 | 99 |          {
 | 
		
	
		
			
			| 123 | 100 |              return Execute((db, table) =>
 | 
		
	
		
			
			| 124 | 101 |              {
 | 
		
	
		
			
			| 125 |  | -                var o = table.FirstOrDefault(predicate);
 | 
		
	
		
			
			| 126 |  | -                if (o == null)
 | 
		
	
		
			
			| 127 |  | -                {
 | 
		
	
		
			
			| 128 |  | -                    return OpResult<TDbObject>.Error(ResultStatus.NotFound, typeof(TThis).Name + ": Value not found", "");
 | 
		
	
		
			
			| 129 |  | -                }
 | 
		
	
		
			
			| 130 |  | -                return OpResult<TDbObject>.Ok(o);
 | 
		
	
		
			
			| 131 |  | -
 | 
		
	
		
			
			|  | 102 | +                var obj = GetSingleDbObject(table, predicate);
 | 
		
	
		
			
			|  | 103 | +                if (!obj)
 | 
		
	
		
			
			|  | 104 | +                    return obj.To<TDboGet>();
 | 
		
	
		
			
			|  | 105 | +                return OpResult<TDboGet>.Ok(DbToDboGetStatic(obj.Data));
 | 
		
	
		
			
			| 132 | 106 |              });
 | 
		
	
		
			
			| 133 | 107 |          }
 | 
		
	
		
			
			| 134 | 108 |  
 | 
		
	
		
			
			| 135 | 109 |          /// <summary>
 | 
		
	
		
			
			| 136 |  | -        /// Get a single DBO matching the predicate
 | 
		
	
		
			
			|  | 110 | +        /// Get an object by its primary key(s)
 | 
		
	
		
			
			| 137 | 111 |          /// </summary>
 | 
		
	
		
			
			| 138 |  | -        /// <param name="predicate">The predicate</param>
 | 
		
	
		
			
			| 139 |  | -        /// <returns>The object that match, or null</returns>
 | 
		
	
		
			
			| 140 |  | -        public static OpResult<TDbo> GetSingleDbo(Expression<Func<TDbObject, bool>> predicate)
 | 
		
	
		
			
			|  | 112 | +        /// <param name="keys">The key names and values</param>
 | 
		
	
		
			
			|  | 113 | +        /// <returns>The object</returns>
 | 
		
	
		
			
			|  | 114 | +        public static OpResult<TDboGet> GetSingleByKeys(params KeyValuePair<string, object>[] keys)
 | 
		
	
		
			
			| 141 | 115 |          {
 | 
		
	
		
			
			| 142 |  | -            return DbToDboStatic(GetSingle(predicate));
 | 
		
	
		
			
			|  | 116 | +            return GetSingle(GetExpression(keys));
 | 
		
	
		
			
			|  | 117 | +        }
 | 
		
	
		
			
			|  | 118 | +
 | 
		
	
		
			
			|  | 119 | +        /// <summary>
 | 
		
	
		
			
			|  | 120 | +        /// Get an object by its id
 | 
		
	
		
			
			|  | 121 | +        /// </summary>
 | 
		
	
		
			
			|  | 122 | +        /// <param name="id">The id of the object</param>
 | 
		
	
		
			
			|  | 123 | +        /// <returns>The object</returns>
 | 
		
	
		
			
			|  | 124 | +        public static OpResult<TDboGet> GetSingleById(long id)
 | 
		
	
		
			
			|  | 125 | +        {
 | 
		
	
		
			
			|  | 126 | +            return GetSingleByKeys(new KeyValuePair<string, object>("id", id));
 | 
		
	
		
			
			| 143 | 127 |          }
 | 
		
	
		
			
			| 144 | 128 |  
 | 
		
	
		
			
			| 145 | 129 |          /// <summary>
 | 
		
	
		
			
			| 146 | 130 |          /// Get all DB object matching the predicate
 | 
		
	
		
			
			| 147 | 131 |          /// </summary>
 | 
		
	
		
			
			| 148 | 132 |          /// <param name="predicate">The predicate</param>
 | 
		
	
		
			
			|  | 133 | +        /// <param name="orderBy">The order by function</param>
 | 
		
	
		
			
			|  | 134 | +        /// <param name="page">The page numeber (0 based)</param>
 | 
		
	
		
			
			|  | 135 | +        /// <param name="perPage">The maximum number of items par page</param>
 | 
		
	
		
			
			| 149 | 136 |          /// <returns>All matching objects</returns>
 | 
		
	
		
			
			| 150 |  | -        public static OpResult<IEnumerable<TDbObject>> GetMultiple(Expression<Func<TDbObject, bool>> predicate)
 | 
		
	
		
			
			|  | 137 | +        public static OpResult<IEnumerable<TDboGet>> GetMultiple<TKey>(Expression<Func<TDbObject, bool>> predicate,
 | 
		
	
		
			
			|  | 138 | +            Expression<Func<TDbObject, TKey>> orderBy, int page = 0,int perPage = Int32.MaxValue)
 | 
		
	
		
			
			| 151 | 139 |          {
 | 
		
	
		
			
			| 152 |  | -            return Execute((db, table) => OpResult<IEnumerable<TDbObject>>.Ok(table.Where(predicate).ToList()));
 | 
		
	
		
			
			|  | 140 | +            return Execute((db, table) =>
 | 
		
	
		
			
			|  | 141 | +            {
 | 
		
	
		
			
			|  | 142 | +                var results = table.OrderBy(orderBy).Where(predicate).Skip(page * perPage).Take(perPage).ToList();
 | 
		
	
		
			
			|  | 143 | +                return OpResult<IEnumerable<TDboGet>>.Ok(results.Select(DbToDboGetStatic));
 | 
		
	
		
			
			|  | 144 | +            });
 | 
		
	
		
			
			| 153 | 145 |          }
 | 
		
	
		
			
			| 154 | 146 |  
 | 
		
	
		
			
			| 155 | 147 |          /// <summary>
 | 
		
	
		
			
			| 156 |  | -        /// Get all DBO matching the predicate
 | 
		
	
		
			
			|  | 148 | +        /// Get all DB object matching the predicate built from keys
 | 
		
	
		
			
			| 157 | 149 |          /// </summary>
 | 
		
	
		
			
			| 158 |  | -        /// <typeparam name="TDbo">The DBO type</typeparam>
 | 
		
	
		
			
			| 159 |  | -        /// <param name="predicate">The predicate</param>
 | 
		
	
		
			
			|  | 150 | +        /// <param name="page">The page numeber (0 based)</param>
 | 
		
	
		
			
			|  | 151 | +        /// <param name="perPage">The maximum number of items par page</param>
 | 
		
	
		
			
			|  | 152 | +        /// <param name="orderBy">The order by function</param>
 | 
		
	
		
			
			|  | 153 | +        /// <param name="keys">The key names and values</param>
 | 
		
	
		
			
			| 160 | 154 |          /// <returns>All matching objects</returns>
 | 
		
	
		
			
			| 161 |  | -        public static OpResult<IEnumerable<TDbo>> GetMultipleDbo(Expression<Func<TDbObject, bool>> predicate)
 | 
		
	
		
			
			|  | 155 | +        public static OpResult<IEnumerable<TDboGet>> GetMultipleByKeys<TKey>(Expression<Func<TDbObject, TKey>> orderBy,
 | 
		
	
		
			
			|  | 156 | +            int page = 0, int perPage = Int32.MaxValue, params KeyValuePair<string, object>[] keys)
 | 
		
	
		
			
			| 162 | 157 |          {
 | 
		
	
		
			
			| 163 |  | -            var res = GetMultiple(predicate);
 | 
		
	
		
			
			| 164 |  | -            if (!res)
 | 
		
	
		
			
			| 165 |  | -                return OpResult<IEnumerable<TDbo>>.Error(res);
 | 
		
	
		
			
			| 166 |  | -            var dbo = res.Data.Select(DbToDboStatic);
 | 
		
	
		
			
			| 167 |  | -            return OpResult<IEnumerable<TDbo>>.Ok(dbo);
 | 
		
	
		
			
			|  | 158 | +            return GetMultiple(GetExpression(keys), orderBy, page, perPage);
 | 
		
	
		
			
			| 168 | 159 |          }
 | 
		
	
		
			
			| 169 | 160 |  
 | 
		
	
		
			
			| 170 | 161 |          /// <summary>
 | 
		
	
	
		
			
			|  | @@ -172,62 +163,94 @@ namespace iiie.WebApiUtils.BusinessManager
 | 
		
	
		
			
			| 172 | 163 |          /// </summary>
 | 
		
	
		
			
			| 173 | 164 |          /// <param name="obj">The object to be added</param>
 | 
		
	
		
			
			| 174 | 165 |          /// <returns>Always true or an OpResult error</returns>
 | 
		
	
		
			
			| 175 |  | -        public static OpResult<bool> Add(TDbObject obj)
 | 
		
	
		
			
			|  | 166 | +        public static OpResult<bool> Add(TDboAdd obj)
 | 
		
	
		
			
			| 176 | 167 |          {
 | 
		
	
		
			
			| 177 | 168 |              return Execute((db, table) =>
 | 
		
	
		
			
			| 178 | 169 |              {
 | 
		
	
		
			
			| 179 |  | -                table.Add(obj);
 | 
		
	
		
			
			|  | 170 | +                table.Add(DboAddToDbStatic(obj));
 | 
		
	
		
			
			| 180 | 171 |                  db.SaveChanges();
 | 
		
	
		
			
			| 181 | 172 |                  return OpResult<bool>.Ok(true);
 | 
		
	
		
			
			| 182 | 173 |              });
 | 
		
	
		
			
			| 183 | 174 |          }
 | 
		
	
		
			
			| 184 | 175 |  
 | 
		
	
		
			
			| 185 | 176 |          /// <summary>
 | 
		
	
		
			
			| 186 |  | -        /// Add an entry in the database
 | 
		
	
		
			
			|  | 177 | +        /// Edit an entry in the database
 | 
		
	
		
			
			| 187 | 178 |          /// </summary>
 | 
		
	
		
			
			| 188 |  | -        /// <param name="obj"></param>
 | 
		
	
		
			
			|  | 179 | +        /// <param name="obj">The object to be added</param>
 | 
		
	
		
			
			|  | 180 | +        /// <param name="predicate">The predicate to be used to select data</param>
 | 
		
	
		
			
			| 189 | 181 |          /// <returns>Always true or an OpResult error</returns>
 | 
		
	
		
			
			| 190 |  | -        public static OpResult<bool> AddDbo(TDbo obj)
 | 
		
	
		
			
			|  | 182 | +        public static OpResult<bool> Edit(TDboEdit obj, Expression<Func<TDbObject, bool>> predicate)
 | 
		
	
		
			
			| 191 | 183 |          {
 | 
		
	
		
			
			| 192 |  | -            return Add(DboToDbStatic(obj));
 | 
		
	
		
			
			|  | 184 | +            return Execute((db, table) =>
 | 
		
	
		
			
			|  | 185 | +            {
 | 
		
	
		
			
			|  | 186 | +                var edit = GetSingleDbObject(table, predicate);
 | 
		
	
		
			
			|  | 187 | +                if (!edit)
 | 
		
	
		
			
			|  | 188 | +                    return edit.To<bool>();
 | 
		
	
		
			
			|  | 189 | +                var res = DboEditToDbStatic(obj, edit.Data);
 | 
		
	
		
			
			|  | 190 | +                db.Entry(edit.Data).CurrentValues.SetValues(res);
 | 
		
	
		
			
			|  | 191 | +                db.SaveChanges();
 | 
		
	
		
			
			|  | 192 | +                return OpResult<bool>.Ok(true);
 | 
		
	
		
			
			|  | 193 | +            });
 | 
		
	
		
			
			| 193 | 194 |          }
 | 
		
	
		
			
			| 194 | 195 |  
 | 
		
	
		
			
			| 195 | 196 |          /// <summary>
 | 
		
	
		
			
			| 196 |  | -        /// Get an object by its primary key(s)
 | 
		
	
		
			
			|  | 197 | +        /// Edit an entry in the database
 | 
		
	
		
			
			| 197 | 198 |          /// </summary>
 | 
		
	
		
			
			| 198 |  | -        /// <param name="pairs">The key names and values</param>
 | 
		
	
		
			
			| 199 |  | -        /// <returns>The object</returns>
 | 
		
	
		
			
			| 200 |  | -        public static OpResult<TDbObject> GetByPrimary(params KeyValuePair<string, object>[] pairs)
 | 
		
	
		
			
			|  | 199 | +        /// <param name="obj">The object to be added</param>
 | 
		
	
		
			
			|  | 200 | +        /// <param name="keys">The keys to be used to select data</param>
 | 
		
	
		
			
			|  | 201 | +        /// <returns>Always true or an OpResult error</returns>
 | 
		
	
		
			
			|  | 202 | +        public static OpResult<bool> Edit(TDboEdit obj, params KeyValuePair<string, object>[] keys)
 | 
		
	
		
			
			|  | 203 | +        {
 | 
		
	
		
			
			|  | 204 | +            return Edit(obj, GetExpression(keys));
 | 
		
	
		
			
			|  | 205 | +        }
 | 
		
	
		
			
			|  | 206 | +
 | 
		
	
		
			
			|  | 207 | +        /// <summary>
 | 
		
	
		
			
			|  | 208 | +        /// Edit an entry in the database
 | 
		
	
		
			
			|  | 209 | +        /// </summary>
 | 
		
	
		
			
			|  | 210 | +        /// <param name="obj">The object to be added</param>
 | 
		
	
		
			
			|  | 211 | +        /// <param name="id">The id to be edited</param>
 | 
		
	
		
			
			|  | 212 | +        /// <returns>Always true or an OpResult error</returns>
 | 
		
	
		
			
			|  | 213 | +        public static OpResult<bool> EditById(TDboEdit obj, long id)
 | 
		
	
		
			
			| 201 | 214 |          {
 | 
		
	
		
			
			| 202 |  | -            var param = Expression.Parameter(typeof(TDbObject), "x");
 | 
		
	
		
			
			| 203 |  | -            Expression totalExp = null;
 | 
		
	
		
			
			| 204 |  | -            foreach (var pair in pairs)
 | 
		
	
		
			
			|  | 215 | +            return Edit(obj, new KeyValuePair<string, object>("id", id));
 | 
		
	
		
			
			|  | 216 | +        }
 | 
		
	
		
			
			|  | 217 | +
 | 
		
	
		
			
			|  | 218 | +        /// <summary>
 | 
		
	
		
			
			|  | 219 | +        /// Delete an entry in the database
 | 
		
	
		
			
			|  | 220 | +        /// </summary>
 | 
		
	
		
			
			|  | 221 | +        /// <param name="predicate">The predicate to be used to delete data</param>
 | 
		
	
		
			
			|  | 222 | +        /// <returns>Always true or an OpResult error</returns>
 | 
		
	
		
			
			|  | 223 | +        public static OpResult<bool> Delete(Expression<Func<TDbObject, bool>> predicate)
 | 
		
	
		
			
			|  | 224 | +        {
 | 
		
	
		
			
			|  | 225 | +            return Execute((db, table) =>
 | 
		
	
		
			
			| 205 | 226 |              {
 | 
		
	
		
			
			| 206 |  | -                var equalExp = Expression.Equal(Expression.Property(param, pair.Key), Expression.Constant(pair.Value));
 | 
		
	
		
			
			| 207 |  | -                totalExp = totalExp == null ? equalExp : Expression.And(equalExp, totalExp);
 | 
		
	
		
			
			| 208 |  | -            }
 | 
		
	
		
			
			| 209 |  | -            var lambda = Expression.Lambda<Func<TDbObject, bool>>(totalExp, param);
 | 
		
	
		
			
			| 210 |  | -            return GetSingle(lambda);
 | 
		
	
		
			
			|  | 227 | +                var del = GetSingleDbObject(table, predicate);
 | 
		
	
		
			
			|  | 228 | +                if (!del)
 | 
		
	
		
			
			|  | 229 | +                    return del.To<bool>();
 | 
		
	
		
			
			|  | 230 | +                table.Remove(del.Data);
 | 
		
	
		
			
			|  | 231 | +                db.SaveChanges();
 | 
		
	
		
			
			|  | 232 | +                return OpResult<bool>.Ok(true);
 | 
		
	
		
			
			|  | 233 | +            });
 | 
		
	
		
			
			| 211 | 234 |          }
 | 
		
	
		
			
			| 212 | 235 |  
 | 
		
	
		
			
			| 213 | 236 |          /// <summary>
 | 
		
	
		
			
			| 214 |  | -        /// Get an object by its id
 | 
		
	
		
			
			|  | 237 | +        /// Delete an entry in the database
 | 
		
	
		
			
			| 215 | 238 |          /// </summary>
 | 
		
	
		
			
			| 216 |  | -        /// <param name="id">The id of the object</param>
 | 
		
	
		
			
			| 217 |  | -        /// <returns>The object</returns>
 | 
		
	
		
			
			| 218 |  | -        public static OpResult<TDbObject> GetById(long id)
 | 
		
	
		
			
			|  | 239 | +        /// <param name="keys">The keys to be used to delete data</param>
 | 
		
	
		
			
			|  | 240 | +        /// <returns>Always true or an OpResult error</returns>
 | 
		
	
		
			
			|  | 241 | +        public static OpResult<bool> Delete(params KeyValuePair<string, object>[] keys)
 | 
		
	
		
			
			| 219 | 242 |          {
 | 
		
	
		
			
			| 220 |  | -            return GetByPrimary(new KeyValuePair<string, object>("id", id));
 | 
		
	
		
			
			|  | 243 | +            return Delete(GetExpression(keys));
 | 
		
	
		
			
			| 221 | 244 |          }
 | 
		
	
		
			
			| 222 | 245 |  
 | 
		
	
		
			
			| 223 | 246 |          /// <summary>
 | 
		
	
		
			
			| 224 |  | -        /// Get an object by its id
 | 
		
	
		
			
			|  | 247 | +        /// Delete an entry in the database
 | 
		
	
		
			
			| 225 | 248 |          /// </summary>
 | 
		
	
		
			
			| 226 |  | -        /// <param name="id">The id of the object</param>
 | 
		
	
		
			
			| 227 |  | -        /// <returns>The object</returns>
 | 
		
	
		
			
			| 228 |  | -        public static OpResult<TDbo> GetByIdDbo(long id)
 | 
		
	
		
			
			|  | 249 | +        /// <param name="id">The id to be deleted</param>
 | 
		
	
		
			
			|  | 250 | +        /// <returns>Always true or an OpResult error</returns>
 | 
		
	
		
			
			|  | 251 | +        public static OpResult<bool> DeleteById(long id)
 | 
		
	
		
			
			| 229 | 252 |          {
 | 
		
	
		
			
			| 230 |  | -            return DbToDboStatic(GetById(id));
 | 
		
	
		
			
			|  | 253 | +            return Delete(new KeyValuePair<string, object>("id", id));
 | 
		
	
		
			
			| 231 | 254 |          }
 | 
		
	
		
			
			| 232 | 255 |      }
 | 
		
	
		
			
			| 233 | 256 |  }
 |