using System; using System.Collections.Generic; using BLToolkit.Data; using BLToolkit.Reflection.Extension; namespace BLToolkit.DataAccess { public class SqlQuery : SqlQueryBase { #region Constructors public SqlQuery() { } public SqlQuery(DbManager dbManager) : base(dbManager) { } public SqlQuery(DbManager dbManager, bool dispose) : base(dbManager, dispose) { } public SqlQuery(ExtensionList extensions) { Extensions = extensions; } #endregion #region Overrides public SqlQueryInfo GetSqlQueryInfo(DbManager db, string actionName) { return base.GetSqlQueryInfo(db, typeof(T), actionName); } #endregion #region SelectByKey public virtual T SelectByKey(DbManager db, params object[] keys) { SqlQueryInfo query = GetSqlQueryInfo(db, typeof(T), "SelectByKey"); return db .SetCommand(query.QueryText, query.GetParameters(db, keys)) .ExecuteObject(); } public virtual T SelectByKey(params object[] keys) { DbManager db = GetDbManager(); try { return SelectByKey(db, keys); } finally { if (DisposeDbManager) db.Dispose(); } } #endregion #region SelectAll static SqlQueryInfo _selectAllQuery; public virtual List SelectAll(DbManager db) { if (_selectAllQuery == null) _selectAllQuery = GetSqlQueryInfo(db, typeof(T), "SelectAll"); return db .SetCommand(_selectAllQuery.QueryText) .ExecuteList(); } public virtual L SelectAll(DbManager db, L list) where L : IList { SqlQueryInfo query = GetSqlQueryInfo(db, typeof(T), "SelectAll"); return db .SetCommand(query.QueryText) .ExecuteList(list); } public virtual L SelectAll(DbManager db) where L : IList, new() { return SelectAll(db, new L()); } public virtual List SelectAll() { DbManager db = GetDbManager(); try { return SelectAll(db); } finally { if (DisposeDbManager) db.Dispose(); } } public virtual L SelectAll(L list) where L : IList { DbManager db = GetDbManager(); try { return SelectAll(db, list); } finally { if (DisposeDbManager) db.Dispose(); } } public virtual L SelectAll() where L : IList, new() { return SelectAll(new L()); } #endregion #region Insert public virtual int Insert(DbManager db, T obj) { SqlQueryInfo query = GetSqlQueryInfo(db, obj.GetType(), "Insert"); return db .SetCommand(query.QueryText, query.GetParameters(db, obj)) .ExecuteNonQuery(); } public virtual int Insert(T obj) { DbManager db = GetDbManager(); try { return Insert(db, obj); } finally { if (DisposeDbManager) db.Dispose(); } } public virtual int Insert(DbManager db, int maxBatchSize, IEnumerable list) { SqlQueryInfo query = GetSqlQueryInfo(db, typeof(T), "InsertBatch"); return db .SetCommand(query.QueryText) .ExecuteForEach( list, query.GetMemberMappers(), maxBatchSize, delegate(T obj) { return query.GetParameters(db, obj); }); } public virtual int Insert(int maxBatchSize, IEnumerable list) { DbManager db = GetDbManager(); try { return Insert(db, maxBatchSize, list); } finally { if (DisposeDbManager) db.Dispose(); } } public virtual int Insert(DbManager db, IEnumerable list) { return Insert(db, int.MaxValue, list); } public virtual int Insert(IEnumerable list) { return Insert(int.MaxValue, list); } #endregion #region Update public virtual int Update(DbManager db, T obj) { SqlQueryInfo query = GetSqlQueryInfo(db, obj.GetType(), "Update"); return db .SetCommand(query.QueryText, query.GetParameters(db, obj)) .ExecuteNonQuery(); } public virtual int Update(T obj) { DbManager db = GetDbManager(); try { return Update(db, obj); } finally { if (DisposeDbManager) db.Dispose(); } } public virtual int Update(DbManager db, int maxBatchSize, IEnumerable list) { SqlQueryInfo query = GetSqlQueryInfo(db, typeof(T), "UpdateBatch"); return db .SetCommand(query.QueryText) .ExecuteForEach( list, query.GetMemberMappers(), maxBatchSize, delegate(T obj) { return query.GetParameters(db, obj); }); } public virtual int Update(int maxBatchSize, IEnumerable list) { DbManager db = GetDbManager(); try { return Update(db, maxBatchSize, list); } finally { if (DisposeDbManager) db.Dispose(); } } public virtual int Update(DbManager db, IEnumerable list) { return Update(db, int.MaxValue, list); } public virtual int Update(IEnumerable list) { return Update(int.MaxValue, list); } #endregion #region DeleteByKey public virtual int DeleteByKey(DbManager db, params object[] key) { SqlQueryInfo query = GetSqlQueryInfo(db, typeof(T), "Delete"); return db .SetCommand(query.QueryText, query.GetParameters(db, key)) .ExecuteNonQuery(); } public virtual int DeleteByKey(params object[] key) { DbManager db = GetDbManager(); try { return DeleteByKey(db, key); } finally { if (DisposeDbManager) db.Dispose(); } } #endregion #region Delete public virtual int Delete(DbManager db, T obj) { SqlQueryInfo query = GetSqlQueryInfo(db, obj.GetType(), "Delete"); return db .SetCommand(query.QueryText, query.GetParameters(db, obj)) .ExecuteNonQuery(); } public virtual int Delete(T obj) { DbManager db = GetDbManager(); try { return Delete(db, obj); } finally { if (DisposeDbManager) db.Dispose(); } } public virtual int Delete(DbManager db, int maxBatchSize, IEnumerable list) { SqlQueryInfo query = GetSqlQueryInfo(db, typeof(T), "DeleteBatch"); return db .SetCommand(query.QueryText) .ExecuteForEach( list, query.GetMemberMappers(), maxBatchSize, delegate(T obj) { return query.GetParameters(db, obj); }); } public virtual int Delete(int maxBatchSize, IEnumerable list) { DbManager db = GetDbManager(); try { return Delete(db, list); } finally { if (DisposeDbManager) db.Dispose(); } } public virtual int Delete(DbManager db, IEnumerable list) { return Delete(db, int.MaxValue, list); } public virtual int Delete(IEnumerable list) { return Delete(int.MaxValue, list); } #endregion } }