.net core中有哪些被拋棄的類
1、DataTable DataRow SqlDataAdapter DataRow DataColumn DataColumn
雖然這些類不是我ORM核心功能,但是為了保證非Core版本的ORM和Core的語法要一致方便以後升級
於是我就有了一個想法將他們復活,打造一個小巧的DataTable,讓更多的老程可以方便的移植到Core。
/// <summary> /// 作者:sunkaixuan /// 建立時間:2016/7/31 /// 修改時間:- /// 說明:讓.netCore支援DataTable /// </summary> public class DataTable { public DataColumnCollection Columns = new DataColumnCollection(); public DataRowCollection Rows = new DataRowCollection(); }
public class DataColumn { public DataColumn() { } public DataColumn(string columnName) { this.ColumnName = columnName; } public DataColumn(string columnName, object dataType) { this.ColumnName = columnName; this.DataType = dataType; } public string ColumnName { get; internal set; } public object DataType { get; internal set; } }
public class DataColumnCollection : IEnumerable, ICollection, IEnumerator { public DataColumn this[int thisIndex] { get { return cols[thisIndex]; } } private int index = -1; private List<DataColumn> cols; public int Count { get { if (this.cols == null) { this.cols = new List<DataColumn>(); } return this.cols.Count; } } public void Add(DataColumn col) { if (this.cols == null) { this.cols = new List<DataColumn>(); } this.cols.Add(col); } public bool IsSynchronized { get { return true; } } public object SyncRoot { get { return null; } } public object Current { get { return cols[index]; } } public void CopyTo(Array array, int index) { throw new NotImplementedException(); } // // 摘要: // 獲取該集合的 System.Collections.IEnumerator。 // // 返回結果: // 該集合的 System.Collections.IEnumerator。 public IEnumerator GetEnumerator() { return (IEnumerator)this; ; } public bool MoveNext() { index++; var isNext = index < cols.Count; if (!isNext) Reset(); return isNext; } public void Reset() { index = -1; } public bool ContainsKey(string name) { if (this.cols == null) return false; return (this.cols.Any(it => it.ColumnName == name)); } }
public class DataRowCollection : IEnumerable, ICollection, IEnumerator { public DataRow this[int thisIndex] { get { return Rows[thisIndex]; } } private int index = -1; private List<DataRow> Rows = null; public int Count { get { if (this.Rows == null) { this.Rows = new List<DataRow>(); } return Rows.Count; } } public object Current { get { if (this.Rows == null) { this.Rows = new List<DataRow>(); } return Rows[index]; } } public bool IsSynchronized { get { return true; } } public object SyncRoot { get { return null; } } public void CopyTo(Array array, int index) { throw new NotImplementedException(); } // // 摘要: // 獲取該集合的 System.Collections.IEnumerator。 // // 返回結果: // 該集合的 System.Collections.IEnumerator。 public IEnumerator GetEnumerator() { return (IEnumerator)this; ; } public bool MoveNext() { index++; var isNext = index < Rows.Count; if (!isNext) Reset(); return isNext; } public void Reset() { index = -1; } internal void Add(DataRow daRow) { if (Rows == null) { Rows = new List<DataRow>(); } Rows.Add(daRow); } } public class DataRow { private Dictionary<string, object> obj = new Dictionary<string, object>(); public void Add(string key, object value) { obj.Add(key, value); } public object this[string name] { get { return obj[name]; } } public object this[int index] { get { int i = 0; object reval = null; foreach (var item in obj) { if (i == index) { reval = item.Value; break; } i++; } return reval; } } public bool ContainsKey(string columnName) { if (this.obj == null) return false; return (this.obj.ContainsKey(columnName)); } } public class SqlDataAdapter { private SqlCommand command; private string sql; private SqlConnection _sqlConnection; public SqlDataAdapter(SqlCommand command) { this.command = command; } public SqlDataAdapter(string sql, SqlConnection _sqlConnection) { this.sql = sql; this._sqlConnection = _sqlConnection; } public SqlCommand SelectCommand { get { if (this.command == null) { this.command = new SqlCommand(this.sql, this._sqlConnection); } return this.command; } } public void Fill(DataTable dt) { if (dt == null) { dt = new DataTable(); } var columns = dt.Columns; var rows = dt.Rows; using (SqlDataReader dr = command.ExecuteReader()) { for (int i = 0; i < dr.FieldCount; i++) { string name = dr.GetName(i).Trim(); if (!columns.ContainsKey(name)) columns.Add(new DataColumn(name, dr.GetFieldType(i))); } while (dr.Read()) { DataRow daRow = new DataRow(); for (int i = 0; i < columns.Count; i++) { if (!daRow.ContainsKey(columns[i].ColumnName)) daRow.Add(columns[i].ColumnName, dr.GetValue(i)); } dt.Rows.Add(daRow); } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.SqlClient; using System.Data; namespace SqlSugar { /// <summary> /// ** 描述:底層SQL輔助函式 /// ** 創始時間:2015-7-13 /// ** 修改時間:- /// ** 作者:sunkaixuan /// ** 使用說明: /// </summary> public class SqlHelper : IDisposable { SqlConnection _sqlConnection; SqlTransaction _tran = null; /// <summary> /// 是否清空SqlParameters /// </summary> public bool isClearParameters = true; public int CommandTimeOut = 30000; /// <summary> /// 將頁面引數自動填充到SqlParameter [],無需在程式中指定,這種情況需要注意是否有重複引數 /// 例如: /// var list = db.Queryable《Student》().Where("id=@id").ToList(); /// 以前寫法 /// var list = db.Queryable《Student》().Where("id=@id", new { id=Request["id"] }).ToList(); /// </summary> public bool IsGetPageParas = false; public SqlHelper(string connectionString) { _sqlConnection = new SqlConnection(connectionString); _sqlConnection.Open(); } public SqlConnection GetConnection() { return _sqlConnection; } public void BeginTran() { _tran = _sqlConnection.BeginTransaction(); } public void BeginTran(IsolationLevel iso) { _tran = _sqlConnection.BeginTransaction(iso); } public void BeginTran(string transactionName) { _tran = _sqlConnection.BeginTransaction(transactionName); } public void BeginTran(IsolationLevel iso, string transactionName) { _tran = _sqlConnection.BeginTransaction(iso, transactionName); } public void RollbackTran() { if (_tran != null) { _tran.Rollback(); _tran = null; } } public void CommitTran() { if (_tran != null) { _tran.Commit(); _tran = null; } } public string GetString(string sql, object pars) { return GetString(sql, SqlSugarTool.GetParameters(pars)); } public string GetString(string sql, params SqlParameter[] pars) { return Convert.ToString(GetScalar(sql, pars)); } public int GetInt(string sql, object pars) { return GetInt(sql, SqlSugarTool.GetParameters(pars)); } public int GetInt(string sql, params SqlParameter[] pars) { return Convert.ToInt32(GetScalar(sql, pars)); } public object GetScalar(string sql, object pars) { return GetScalar(sql, SqlSugarTool.GetParameters(pars)); } public object GetScalar(string sql, params SqlParameter[] pars) { SqlCommand sqlCommand = new SqlCommand(sql, _sqlConnection); if (_tran != null) { sqlCommand.Transaction = _tran; } sqlCommand.CommandTimeout = this.CommandTimeOut; if (pars != null) sqlCommand.Parameters.AddRange(pars); if (IsGetPageParas) { SqlSugarToolExtensions.RequestParasToSqlParameters(sqlCommand.Parameters); } object scalar = sqlCommand.ExecuteScalar(); scalar = (scalar == null ? 0 : scalar); sqlCommand.Parameters.Clear(); return scalar; } public int ExecuteCommand(string sql, object pars) { return ExecuteCommand(sql, SqlSugarTool.GetParameters(pars)); } public int ExecuteCommand(string sql, params SqlParameter[] pars) { SqlCommand sqlCommand = new SqlCommand(sql, _sqlConnection); sqlCommand.CommandTimeout = this.CommandTimeOut; if (_tran != null) { sqlCommand.Transaction = _tran; } if (pars != null) sqlCommand.Parameters.AddRange(pars); if (IsGetPageParas) { SqlSugarToolExtensions.RequestParasToSqlParameters(sqlCommand.Parameters); } int count = sqlCommand.ExecuteNonQuery(); sqlCommand.Parameters.Clear(); return count; } public SqlDataReader GetReader(string sql, object pars) { return GetReader(sql, SqlSugarTool.GetParameters(pars)); } public SqlDataReader GetReader(string sql, params SqlParameter[] pars) { SqlCommand sqlCommand = new SqlCommand(sql, _sqlConnection); sqlCommand.CommandTimeout = this.CommandTimeOut; if (_tran != null) { sqlCommand.Transaction = _tran; } if (pars != null) sqlCommand.Parameters.AddRange(pars); if (IsGetPageParas) { SqlSugarToolExtensions.RequestParasToSqlParameters(sqlCommand.Parameters); } SqlDataReader sqlDataReader = sqlCommand.ExecuteReader(); if (isClearParameters) sqlCommand.Parameters.Clear(); return sqlDataReader; } public List<T> GetList<T>(string sql, object pars) { return GetList<T>(sql, SqlSugarTool.GetParameters(pars)); } public List<T> GetList<T>(string sql, params SqlParameter[] pars) { var reval = SqlSugarTool.DataReaderToList<T>(typeof(T), GetReader(sql, pars), null); return reval; } public T GetSingle<T>(string sql, object[] pars) { return GetSingle<T>(sql, SqlSugarTool.GetParameters(pars)); } public T GetSingle<T>(string sql, params SqlParameter[] pars) { var reval = SqlSugarTool.DataReaderToList<T>(typeof(T), GetReader(sql, pars), null).Single(); return reval; } public DataTable GetDataTable(string sql, object pars) { return GetDataTable(sql, SqlSugarTool.GetParameters(pars)); } public DataTable GetDataTable(string sql, params SqlParameter[] pars) { SqlDataAdapter _sqlDataAdapter = new SqlDataAdapter(sql, _sqlConnection); _sqlDataAdapter.SelectCommand.Parameters.AddRange(pars); if (IsGetPageParas) { SqlSugarToolExtensions.RequestParasToSqlParameters(_sqlDataAdapter.SelectCommand.Parameters); } _sqlDataAdapter.SelectCommand.CommandTimeout = this.CommandTimeOut; if (_tran != null) { _sqlDataAdapter.SelectCommand.Transaction = _tran; } DataTable dt = new DataTable(); _sqlDataAdapter.Fill(dt); _sqlDataAdapter.SelectCommand.Parameters.Clear(); return dt; } public void Dispose() { if (_sqlConnection != null) { if (_sqlConnection.State != ConnectionState.Closed) { if (_tran != null) _tran.Commit(); _sqlConnection.Close(); } } } } }
2.GetType的擴充套件屬性發生變更
例如 Type.IsEnum在Core中要寫成 Type.GetTypeInfo().IsEnum
於是我將程式碼進行封裝,讓語法不變
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Reflection; namespace SqlSugar { public static class TypeExtensions { public static PropertyInfo[] GetProperties(this Type type) { var reval = type.GetTypeInfo().GetProperties(); return reval; } public static PropertyInfo GetProperty(this Type type, string name) { var reval = type.GetTypeInfo().GetProperty(name); return reval; } public static FieldInfo GetField(this Type type, string name) { var reval = type.GetTypeInfo().GetField(name); return reval; } public static bool IsEnum(this Type type) { var reval = type.GetTypeInfo().IsEnum; return reval; } public static MethodInfo GetMethod(this Type type, string name) { var reval = type.GetTypeInfo().GetMethod(name); return reval; } public static MethodInfo GetMethod(this Type type, string name, Type[] types) { var reval = type.GetTypeInfo().GetMethod(name, types); return reval; } public static ConstructorInfo GetConstructor(this Type type, Type[] types) { var reval = type.GetTypeInfo().GetConstructor(types); return reval; } } }
3、System.Web類
因為SqlSugar ORM並沒有用到System.Web的功能,所以基本沒什麼事兒
SqlSugar一款輕量級高效能ORM框架 Core版只有80K功能強大
將Demo進行了整理方便大家使用
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using SqlSugar; using SqlSugarTest.Demos; namespace SqlSugarTest { public class Program { public static void Main(string[] args) { using (SqlSugarClient db = new SqlSugarClient("server=.;uid=sa;pwd=sasa;database=SqlSugarTest")) { var dt = db.GetDataTable("select * from student where id=@id", new { id = 1 }); //設定執行的DEMO string switch_on = "EnumType"; IDemos demo = null; switch (switch_on) { //ADO.NET基本功能 case "Ado": demo = new Ado(); break; //查詢 case "Select": demo = new Select(); break; //插入 case "Insert": demo = new Insert(); break; //更新 case "Update": demo = new Update(); break; //刪除 case "Delete": demo = new Delete(); break; //事務 case "Tran": demo = new Tran(); break; //生成實體 case "CreateClass": demo = new CreateClass(); break; //列舉型別的支援 case "EnumType": demo = new EnumType(); break; //除了多庫平行計算外的所有功能都已經移植成功更多例子請關注我的部落格 } //執行DEMO demo.Init(); Console.WriteLine("執行成功請關閉視窗"); Console.ReadKey(); } } } }
目錄更加簡潔明瞭
查詢:
using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace SqlSugarTest.Demos { public class Select:IDemos { public void Init() { //單表查詢 QueryableDemo(); //多表查詢 SqlableDemo(); //Sql查詢 SqlQuery(); //新容器轉換 NewSelect(); } /// <summary> /// 新容器轉換 /// </summary> private void NewSelect() { using (SqlSugarClient db = SugarDao.GetInstance()) { var list2 = db.Queryable<Student>().Where(c => c.id < 10).Select(c => new classNew { newid = c.id, newname = c.name, xx_name = c.name }).ToList();//不支援匿名類轉換,也不建議使用 var list3 = db.Queryable<Student>().Where(c => c.id < 10).Select(c => new { newid = c.id, newname = c.name, xx_name = c.name }).ToDynamic();//匿名類轉換 } } /// <summary> /// Sql查詢 /// </summary> private void SqlQuery() { using (var db = SugarDao.GetInstance()) { //轉成list List<Student> list1 = db.SqlQuery<Student>("select * from Student"); //轉成list帶參 List<Student> list2 = db.SqlQuery<Student>("select * from Student where id=@id", new { id = 1 }); //轉成dynamic dynamic list3 = db.SqlQueryDynamic("select * from student"); //轉成json string list4 = db.SqlQueryJson("select * from student"); //返回int var list5 = db.SqlQuery<int>("select top 1 id from Student").Single(); //反回鍵值 Dictionary<string, string> list6 = db.SqlQuery<KeyValuePair<string, string>>("select id,name from Student").ToDictionary(it => it.Key, it => it.Value); //反回List<string[]> var list7 = db.SqlQuery<string[]>("select top 1 id,name from Student").Single(); //儲存過程 var spResult = db.SqlQuery<School>("exec sp_school @p1,@p2", new { p1 = 1, p2 = 2 }); } } /// <summary> /// 多表查詢 /// </summary> private void SqlableDemo() { using (var db = SugarDao.GetInstance()) { //---------Sqlable,建立多表查詢---------// //多表查詢 List<School> dataList = db.Sqlable() .From("school", "s") .Join("student", "st", "st.id", "s.id", JoinType.INNER) .Join("student", "st2", "st2.id", "st.id", JoinType.LEFT) .Where("s.id>100 and s.id<@id") .Where("1=1")//可以多個WHERE .SelectToList<School/*新的Model我這裡沒有所以寫的School*/>("st.*", new { id = 1 }); //多表分頁 List<School> dataPageList = db.Sqlable() .From("school", "s") .Join("student", "st", "st.id", "s.id", JoinType.INNER) .Join("student", "st2", "st2.id", "st.id", JoinType.LEFT) .Where("s.id>100 and s.id<100") .SelectToPageList<School>("st.*", "s.id", 1, 10); //多表分頁WHERE加子查詢 List<School> dataPageList2 = db.Sqlable() .From("school", "s") .Join("student", "st", "st.id", "s.id", JoinType.INNER) .Join("student", "st2", "st2.id", "st.id", JoinType.LEFT) .Where("s.id>100 and s.id<100 and s.id in (select 1 )" /*這裡面寫子查詢都可以*/) .SelectToPageList<School>("st.*", "s.id", 1, 10); //--------轉成List Dynmaic 或者 Json-----// //不分頁 var list1 = db.Sqlable().From("student", "s").Join("school", "l", "s.sch_id", "l.id and l.id=@id", JoinType.INNER).SelectToDynamic("*", new { id = 1 }); var list2 = db.Sqlable().From("student", "s").Join("school", "l", "s.sch_id", "l.id and l.id=@id", JoinType.INNER).SelectToJson("*", new { id = 1 }); var list3 = db.Sqlable().From("student", "s").Join("school", "l", "s.sch_id", "l.id and l.id=@id", JoinType.INNER).SelectToDataTable("*", new { id = 1 }); //分頁 var list4 = db.Sqlable().From("student", "s").Join("school", "l", "s.sch_id", "l.id and l.id=@id", JoinType.INNER).SelectToPageDynamic("s.*", "l.id", 1, 10, new { id = 1 }); var list5 = db.Sqlable().From("student", "s").Join("school", "l", "s.sch_id", "l.id and l.id=@id", JoinType.INNER).SelectToPageTable("s.*", "l.id", 1, 10, new { id = 1 }); var list6 = db.Sqlable().From("student", "s").Join("school", "l", "s.sch_id", "l.id and l.id=@id", JoinType.INNER).SelectToPageDynamic("s.*", "l.id", 1, 10, new { id = 1 }); //--------拼接-----// Sqlable sable = db.Sqlable().From<Student>("s").Join<School>("l", "s.sch_id", "l.id", JoinType.INNER); string name = "a"; int id = 1; if (!string.IsNullOrEmpty(name)) { sable = sable.Where("s.name=@name"); } if (!string.IsNullOrEmpty(name)) { sable = sable.Where("s.id=@id or s.id=100"); } if (id > 0) { sable = sable.Where("l.id in (select top 10 id from school)");//where加子查詢 } var pars = new { id = id, name = name }; int pageCount = sable.Count(pars); var list7 = sable.SelectToPageList<Student>("s.*", "l.id desc", 1, 20, pars); } } /// <summary> /// 單表查詢 /// </summary> private void QueryableDemo() { using (var db = SugarDao.GetInstance()) { //---------Queryable<T>,擴充套件函式查詢---------// //針對單表或者檢視查詢 //查詢所有 var student = db.Queryable<Student>().ToList(); var studentDynamic = db.Queryable<Student>().ToDynamic(); var studentJson = db.Queryable<Student>().ToJson(); //查詢單條 var single = db.Queryable<Student>().Single(c => c.id == 1); //查詢單條沒有記錄返回空物件 var single2 = db.Queryable<Student>().Where(c => c.id == 1).SingleOrDefault(); //查詢第一條 var first = db.Queryable<Student>().Where(c => c.id == 1).First(); var first2 = db.Queryable<Student>().Where(c => c.id == 1).FirstOrDefault(); //取10-20條 var page1 = db.Queryable<Student>().Where(c => c.id > 10).OrderBy("id").Skip(10).Take(20).ToList(); //上一句的簡化寫法,同樣取10-20條 var page2 = db.Queryable<Student>().Where(c => c.id > 10).OrderBy("id").ToPageList(2, 10); //查詢條數 var count = db.Queryable<Student>().Where(c => c.id > 10).Count(); //從第2條開始以後取所有 var skip = db.Queryable<Student>().Where(c => c.id > 10).OrderBy("id").Skip(2).ToList(); //取前2條 var take = db.Queryable<Student>().Where(c => c.id > 10).OrderBy("id").Take(2).ToList(); // Not like string conval = "a"; var notLike = db.Queryable<Student>().Where(c => !c.name.Contains(conval.ToString())).ToList(); //Like conval = "三"; var like = db.Queryable<Student>().Where(c => c.name.Contains(conval)).ToList(); // 可以在拉姆達使用 ToString和 Convert,比EF出色的地方 var convert1 = db.Queryable<Student>().Where(c => c.name == "a".ToString()).ToList(); var convert2 = db.Queryable<Student>().Where(c => c.id == Convert.ToInt32("1")).ToList();// var convert3 = db.Queryable<Student>().Where(c => DateTime.Now > Convert.ToDateTime("2015-1-1")).ToList(); var convert4 = db.Queryable<Student>().Where(c => DateTime.Now > DateTime.Now).ToList(); //支援字串Where 讓你解決,更復雜的查詢 var student12 = db.Queryable<Student>().Where(c => "a" == "a").Where("id>100").ToList(); var student13 = db.Queryable<Student>().Where(c => "a" == "a").Where("id>100 and id in( select 1)").ToList(); //存在記錄反回true,則否返回false bool isAny100 = db.Queryable<Student>().Any(c => c.id == 100); bool isAny1 = db.Queryable<Student>().Any(c => c.id == 1); int maxId = db.Queryable<Student>().Max<Student, int>("id"); int minId = db.Queryable<Student>().Where(c => c.id > 0).Min<Student, int>("id"); //In var list1 = db.Queryable<Student>().In("id", "1", "2", "3").ToList(); var list2 = db.Queryable<Student>().In("id", new string[] { "1", "2", "3" }).ToList(); var list3 = db.Queryable<Student>().In("id", new List<string> { "1", "2", "3" }).ToList(); var list4 = db.Queryable<Student>().Where(it => it.id < 10).In("id", new List<string> { "1", "2", "3" }).ToList(); //分組查詢 var list5 = db.Queryable<Student>().Where(c => c.id < 20).GroupBy("sex").Select<Student, SexTotal>("Sex,Count=count(*)").ToList(); //SELECT Sex,Count=count(*) FROM Student WHERE 1=1 AND (id < 20) GROUP BY Sex --生成結果 } } } }
更多用法:
http://www.cnblogs.com/sunkaixuan/p/5654695.html 除了平行計算的功能其它都移植成功
原始碼:
Core版本
https://github.com/sunkaixuan/ASP_NET_CORE_ORM_SqlSugar
.net 版本
https://github.com/sunkaixuan/SqlSugar