{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "19839fa7",
   "metadata": {
    "polyglot_notebook": {
     "kernelName": "csharp"
    }
   },
   "source": [
    "使用 .net 程序操作数据库\n",
    "=======================\n",
    "除了使用SQL内核执行SQL语句直接操作数据库,使用最多的是使用用.net程序操作数据库:\n",
    "+ ado.net 原生操作\n",
    "+ 使用ORM框架,比如 Daper、EFCore、SqlSugar、FreeSQL等"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4ca948bd",
   "metadata": {},
   "source": [
    "## 初始化"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "4f5767d2",
   "metadata": {
    "polyglot_notebook": {
     "kernelName": "csharp"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div><div></div><div></div><div><strong>Installed Packages</strong><ul><li><span>Dapper, 2.1.66</span></li><li><span>DuckDB.NET.Data.Full, 1.2.1</span></li><li><span>Microsoft.Data.SqlClient, 6.0.1</span></li><li><span>Microsoft.Data.Sqlite, 9.0.4</span></li><li><span>Microsoft.EntityFrameworkCore, 9.0.4</span></li><li><span>Microsoft.EntityFrameworkCore.Sqlite, 9.0.4</span></li><li><span>Microsoft.EntityFrameworkCore.SqlServer, 9.0.4</span></li><li><span>MongoDB.EntityFrameworkCore, 9.0.0</span></li><li><span>MySql.Data, 9.3.0</span></li><li><span>MySql.EntityFrameworkCore, 9.0.3</span></li><li><span>Npgsql, 9.0.3</span></li><li><span>Npgsql.EntityFrameworkCore.PostgreSQL, 9.0.4</span></li></ul></div></div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<div><div></div><div></div><div><strong>Installed Packages</strong><ul><li><span>Microsoft.Extensions.Configuration, 9.0.4</span></li><li><span>Microsoft.Extensions.Configuration.Binder, 9.0.4</span></li><li><span>Microsoft.Extensions.Configuration.CommandLine, 9.0.4</span></li><li><span>Microsoft.Extensions.Configuration.EnvironmentVariables, 9.0.4</span></li><li><span>Microsoft.Extensions.Configuration.ini, 9.0.4</span></li><li><span>Microsoft.Extensions.Configuration.json, 9.0.4</span></li><li><span>Microsoft.Extensions.Configuration.KeyPerFile, 9.0.4</span></li><li><span>Microsoft.Extensions.Configuration.UserSecrets, 9.0.4</span></li><li><span>Microsoft.Extensions.Configuration.xml, 9.0.4</span></li><li><span>microsoft.extensions.dependencyinjection, 9.0.4</span></li><li><span>microsoft.extensions.logging, 9.0.4</span></li><li><span>Microsoft.Extensions.Logging.Configuration, 9.0.4</span></li><li><span>Microsoft.Extensions.Logging.Console, 9.0.4</span></li><li><span>Microsoft.Extensions.Logging.Debug, 9.0.4</span></li><li><span>Microsoft.Extensions.Logging.EventSource, 9.0.4</span></li><li><span>microsoft.extensions.options, 9.0.4</span></li><li><span>Microsoft.Extensions.Options.ConfigurationExtensions, 9.0.4</span></li><li><span>Microsoft.Extensions.Options.DataAnnotations, 9.0.4</span></li></ul></div></div>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#!import \"./Base.ipynb\"\n",
    "\n",
    "//共享\n",
    "#r \"nuget:Microsoft.Data.SqlClient\"\n",
    "#r \"nuget:MySql.Data\"\n",
    "#r \"nuget:Npgsql\"\n",
    "#r \"nuget:Microsoft.Data.Sqlite\"\n",
    "#r \"nuget:DuckDB.NET.Data.Full\"\n",
    "\n",
    "#r \"nuget:Dapper\"\n",
    "\n",
    "#r \"nuget:Microsoft.EntityFrameworkCore\"\n",
    "#r \"nuget:Microsoft.EntityFrameworkCore.SqlServer\"\n",
    "#r \"nuget:Microsoft.EntityFrameworkCore.Sqlite\"\n",
    "#r \"nuget:Npgsql.EntityFrameworkCore.PostgreSQL\"\n",
    "#r \"nuget:MySql.EntityFrameworkCore\"\n",
    "//#r \"nuget:Pomelo.EntityFrameworkCore.MySql\"\n",
    "#r \"nuget:MongoDB.EntityFrameworkCore\"\n",
    "\n",
    "global using System.Text.Json;\n",
    "global using System.Text.Json.Schema;\n",
    "global using System.Text.Json.Serialization;\n",
    "\n",
    "global using System.Data;\n",
    "global using System.Data.Common;\n",
    "global using System.Data.SqlTypes;\n",
    "global using System.Data.SqlClient;\n",
    "//global using System.Data.OracleClient;\n",
    "\n",
    "global using Microsoft.Data.SqlClient;\n",
    "global using Microsoft.Data.SqlClient.Server;\n",
    "\n",
    "global using MySql.Data;\n",
    "global using MySql.Data.Types;\n",
    "global using MySql.Data.MySqlClient;\n",
    "\n",
    "global using Microsoft.Data.Sqlite;\n",
    "\n",
    "global using DuckDB.NET.Data;\n",
    "global using DuckDB.NET.Data.DataChunk;\n",
    "\n",
    "global using Dapper;\n",
    "\n",
    "global using Npgsql;\n",
    "global using Npgsql.Schema;\n",
    "global using Npgsql.PostgresTypes;\n",
    "global using Npgsql.TypeMapping;\n",
    "global using Npgsql.Util;\n",
    "global using Npgsql.NameTranslation;\n",
    "global using Npgsql.BackendMessages;\n",
    "\n",
    "\n",
    "global using Microsoft.EntityFrameworkCore;\n",
    "global using Microsoft.EntityFrameworkCore.SqlServer;\n",
    "global using Microsoft.EntityFrameworkCore.Sqlite;\n",
    "global using Npgsql.EntityFrameworkCore.PostgreSQL;\n",
    "global using MySql.EntityFrameworkCore;\n",
    "global using MongoDB.EntityFrameworkCore;\n",
    "\n",
    "//共享方法\n",
    "public static List<Student> DatatableToStudent(DataTable studentTable)\n",
    "{\n",
    "    var students = new List<Student>();\n",
    "    if(studentTable == null)\n",
    "    {\n",
    "        return students;\n",
    "    }\n",
    "\n",
    "    if(studentTable.Columns.Count ==0)\n",
    "    {\n",
    "        return students;\n",
    "    }\n",
    "\n",
    "    if(studentTable.Rows.Count <=0)\n",
    "    {\n",
    "        return students;\n",
    "    }\n",
    "\n",
    "    foreach(DataRow row in studentTable.Rows)\n",
    "    {\n",
    "        var student = new Student()\n",
    "        {\n",
    "            Id = (int)row[\"Id\"],\n",
    "            Name = row[\"Name\"] == DBNull.Value ? \"\" : (string)row[\"Name\"].ToString(),\n",
    "            Age = row[\"Age\"] == DBNull.Value ? 0 : (int)row[\"Age\"]\n",
    "        };\n",
    "\n",
    "        students.Add(student);\n",
    "    }\n",
    "\n",
    "    return students;\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c66c5da7",
   "metadata": {},
   "source": [
    "## 使用 ADO.NET"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6b1ebc4f",
   "metadata": {},
   "source": [
    "### SQL Server 数据库(2019为例)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "f64d17d8",
   "metadata": {
    "polyglot_notebook": {
     "kernelName": "csharp"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "查询到: 528 行数据\n",
      "前2行:[{\"Id\":1,\"Name\":\"吕宇宁\",\"Age\":74},{\"Id\":6,\"Name\":\"林杰宏\",\"Age\":73}]\n"
     ]
    }
   ],
   "source": [
    "//Ado.Net 操作SQL Server\n",
    "{\n",
    "    DataSet ds = new DataSet();\n",
    "\n",
    "    using(var mssqlConnection = new SqlConnection(SharedDbConnect.MsSqlConnectionString))\n",
    "    {\n",
    "        mssqlConnection.Open();\n",
    "\n",
    "        var querySql = \"select * FROM student where age >@age;\";\n",
    "        SqlParameter[] parameters = new SqlParameter[]\n",
    "        {\n",
    "            new SqlParameter()\n",
    "            {\n",
    "                ParameterName = \"age\",\n",
    "                SqlDbType = SqlDbType.Int,\n",
    "                Value = 50,\n",
    "                Direction = ParameterDirection.Input,\n",
    "                Size = 4,\n",
    "                DbType = DbType.Int32,\n",
    "                IsNullable = false,\n",
    "            }\n",
    "        };\n",
    "        var command = new SqlCommand(querySql, mssqlConnection);\n",
    "        command.Parameters.AddRange(parameters);\n",
    "\n",
    "        var adapter =  new SqlDataAdapter(command);\n",
    "        adapter.Fill(ds);\n",
    "\n",
    "        mssqlConnection.Close();\n",
    "        mssqlConnection.Dispose();\n",
    "    }\n",
    "\n",
    "    var students = DatatableToStudent(ds.Tables[0]);\n",
    "\n",
    "    Console.WriteLine($\"查询到: {students.Count()} 行数据\");\n",
    "    var jsonText = System.Text.Json.JsonSerializer.Serialize(students.Take<Student>(2), new System.Text.Json.JsonSerializerOptions()\n",
    "    {\n",
    "        Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All),\n",
    "        WriteIndented = false,\n",
    "    });\n",
    "\n",
    "    Console.WriteLine($\"前2行:{jsonText}\");\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "a604fbea",
   "metadata": {
    "polyglot_notebook": {
     "kernelName": "csharp"
    }
   },
   "source": [
    "### MySQL"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "90085b98",
   "metadata": {
    "polyglot_notebook": {
     "kernelName": "csharp"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Id             Name           Age            \n",
      "1              江子韬            28             \n",
      "2              苏震南            48             \n"
     ]
    }
   ],
   "source": [
    "//Ado.Net 操作MySQL\n",
    "{\n",
    "    //查询数据\n",
    "    DataSet ds = new DataSet();\n",
    "\n",
    "    using(var sqlConnection = new MySqlConnection(SharedDbConnect.MySQLConnectionString))\n",
    "    {\n",
    "        sqlConnection.Open();\n",
    "\n",
    "        var querySql = \"SELECT * FROM `Student` LIMIT 2;\";\n",
    "        var command = new MySqlCommand(querySql, sqlConnection);\n",
    "\n",
    "        var adapter =  new MySqlDataAdapter(command);\n",
    "        adapter.Fill(ds);\n",
    "\n",
    "        sqlConnection.Close();\n",
    "        sqlConnection.Dispose();\n",
    "    }\n",
    "\n",
    "    //输出数据\n",
    "    var dt = ds.Tables[0];\n",
    "    int padRightCount = 15;\n",
    "\n",
    "    //输出列\n",
    "    List<string> columnNames = new List<string>(100);\n",
    "    foreach(DataColumn c in dt.Columns)\n",
    "    {\n",
    "        columnNames.Add(c.ColumnName.PadRight(padRightCount));\n",
    "    }\n",
    "\n",
    "    Console.WriteLine(string.Join(\"\", columnNames));\n",
    "\n",
    "    //输出数据\n",
    "    foreach(DataRow row in dt.Rows)\n",
    "    {\n",
    "        List<string> rowItemValues = new List<string>(100);\n",
    "\n",
    "        for(int i=0; i<columnNames.Count(); i++)\n",
    "        {\n",
    "            var valueText = row[i] == DBNull.Value? \"null\" : row[i].ToString();\n",
    "            rowItemValues.Add(valueText.PadRight(padRightCount));\n",
    "        }\n",
    "\n",
    "        Console.WriteLine(string.Join(\"\",rowItemValues));\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c601df54",
   "metadata": {},
   "source": [
    "### PostgreSQL"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "bb00b479",
   "metadata": {
    "polyglot_notebook": {
     "kernelName": "csharp"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Id             Name           Age            \n",
      "1              邵致远            62             \n",
      "2              孙致远            4              \n",
      "3              陶震南            60             \n",
      "4              邹安琪            63             \n",
      "5              宋安琪            17             \n"
     ]
    }
   ],
   "source": [
    "//Ado.Net 操作PostgreSQL\n",
    "{\n",
    "    //查询数据\n",
    "    DataSet ds = new DataSet();\n",
    "    using(var sqlConnection = new NpgsqlConnection(SharedDbConnect.PSQLConnectionString))\n",
    "    {\n",
    "        sqlConnection.Open();\n",
    "        \n",
    "        var querySql = \n",
    "        \"\"\"\n",
    "            SELECT * FROM \"Student\" LIMIT 5;\n",
    "        \"\"\";\n",
    "        var command = new NpgsqlCommand(querySql, sqlConnection);\n",
    "\n",
    "        var adapter =  new NpgsqlDataAdapter(command);\n",
    "        adapter.Fill(ds);\n",
    "\n",
    "        sqlConnection.Close();\n",
    "        sqlConnection.Dispose();\n",
    "    }\n",
    "\n",
    "    //输出数据\n",
    "    var dt = ds.Tables[0];\n",
    "    int padRightCount = 15;\n",
    "\n",
    "    //输出列\n",
    "    List<string> columnNames = new List<string>(100);\n",
    "    foreach(DataColumn c in dt.Columns)\n",
    "    {\n",
    "        columnNames.Add(c.ColumnName.PadRight(padRightCount));\n",
    "    }\n",
    "\n",
    "    Console.WriteLine(string.Join(\"\", columnNames));\n",
    "\n",
    "    //输出数据\n",
    "    foreach(DataRow row in dt.Rows)\n",
    "    {\n",
    "        List<string> rowItemValues = new List<string>(100);\n",
    "\n",
    "        for(int i=0; i<columnNames.Count(); i++)\n",
    "        {\n",
    "            var valueText = row[i] == DBNull.Value? \"null\" : row[i].ToString();\n",
    "            rowItemValues.Add(valueText.PadRight(padRightCount));\n",
    "        }\n",
    "\n",
    "        Console.WriteLine(string.Join(\"\",rowItemValues));\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "a52047f6",
   "metadata": {
    "polyglot_notebook": {
     "kernelName": "csharp"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Id             Name           Age            \n",
      "1              邵致远            62             \n",
      "2              孙致远            4              \n",
      "3              陶震南            60             \n",
      "4              邹安琪            63             \n",
      "5              宋安琪            17             \n"
     ]
    }
   ],
   "source": [
    "//Ado.Net 操作PostgreSQL: 客户端官方用法(异步)\n",
    "{\n",
    "    //查询数据\n",
    "    DataSet ds = new DataSet();\n",
    "    int padRightCount = 15;\n",
    "   \n",
    "    await using var dataSource = NpgsqlDataSource.Create(SharedDbConnect.PSQLConnectionString);\n",
    "\n",
    "    await using (var cmd = dataSource.CreateCommand(\"SELECT * FROM \\\"Student\\\" LIMIT 5;\"))\n",
    "\n",
    "    await using (var reader = await cmd.ExecuteReaderAsync())\n",
    "    {\n",
    "        //输出列名\n",
    "         List<string> columnNames = reader.GetColumnSchema().Select(c => c.ColumnName.PadRight(padRightCount)).ToList();\n",
    "        Console.WriteLine(string.Join(\"\", columnNames));\n",
    "\n",
    "        //循环输出行数据\n",
    "        while (await reader.ReadAsync())\n",
    "        {\n",
    "            List<string> rowItemValues = new List<string>(100);\n",
    "            for(int i=0; i<columnNames.Count(); i++)\n",
    "            {\n",
    "                var valueText = reader.GetFieldValue<object>(i).ToString();\n",
    "                rowItemValues.Add(valueText.PadRight(padRightCount));\n",
    "            }\n",
    "\n",
    "            Console.WriteLine(string.Join(\"\",rowItemValues));\n",
    "        }\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e1c9381b",
   "metadata": {},
   "source": [
    "### SQLite"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "96de0cac",
   "metadata": {
    "polyglot_notebook": {
     "kernelName": "csharp"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Id             Name           Age            \n",
      "1              龚致远            70             \n",
      "2              潘宇宁            48             \n",
      "3              陶杰宏            5              \n",
      "4              彭晓明            46             \n",
      "5              江震南            63             \n"
     ]
    }
   ],
   "source": [
    "//Ado.Net 操作SQLite\n",
    "{\n",
    "    //查询数据\n",
    "    DataSet ds = new DataSet();\n",
    "    int padRightCount = 15;\n",
    "\n",
    "    using(var sqlConnection = new SqliteConnection(SharedDbConnect.SQLiteConnectionString))\n",
    "    {\n",
    "        sqlConnection.Open();\n",
    "        \n",
    "        var querySql = \n",
    "        \"\"\"\n",
    "            SELECT * FROM Student LIMIT 5;\n",
    "        \"\"\";\n",
    "        var cmd = sqlConnection.CreateCommand();\n",
    "        cmd.CommandType = CommandType.Text;\n",
    "        cmd.CommandText = querySql;\n",
    "\n",
    "        using (var reader = await cmd.ExecuteReaderAsync())\n",
    "        {\n",
    "            //输出列名\n",
    "            List<string> columnNames = reader.GetColumnSchema().Select(c => c.ColumnName.PadRight(padRightCount)).ToList();\n",
    "            Console.WriteLine(string.Join(\"\", columnNames));\n",
    "\n",
    "            //循环输出行数据\n",
    "            while (await reader.ReadAsync())\n",
    "            {\n",
    "                List<string> rowItemValues = new List<string>(100);\n",
    "                for(int i=0; i<columnNames.Count(); i++)\n",
    "                {\n",
    "                    var valueText = reader.GetFieldValue<object>(i).ToString();\n",
    "                    rowItemValues.Add(valueText.PadRight(padRightCount));\n",
    "                }\n",
    "\n",
    "                Console.WriteLine(string.Join(\"\",rowItemValues));\n",
    "            }\n",
    "        }\n",
    "\n",
    "        sqlConnection.Close();\n",
    "        sqlConnection.Dispose();\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b0035452",
   "metadata": {},
   "source": [
    "### DuckDB"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "f986fed7",
   "metadata": {
    "polyglot_notebook": {
     "kernelName": "csharp"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Id             Name           Age            \n",
      "1              张三             10             \n",
      "2              李四             33             \n",
      "3              王五             66             \n"
     ]
    }
   ],
   "source": [
    "//Ado.Net 操作DuckDB数据库\n",
    "{\n",
    "    int padRightCount = 15;\n",
    "\n",
    "    using(var sqlConnection = new DuckDBConnection(SharedDbConnect.DuckDBConnectionString))\n",
    "    {\n",
    "        sqlConnection.Open();\n",
    "        //1、创建表\n",
    "        var createTableSql = \n",
    "        \"\"\"\n",
    "        CREATE TABLE Student \n",
    "        (\n",
    "            Id INTEGER,\n",
    "            Name TEXT,\n",
    "            Age INTEGER\n",
    "        );\n",
    "        \"\"\";\n",
    "\n",
    "        var createCommand = sqlConnection.CreateCommand();\n",
    "        createCommand.CommandType = CommandType.Text;\n",
    "        createCommand.CommandText = createTableSql;\n",
    "\n",
    "        var createCount = createCommand.ExecuteNonQuery();\n",
    "        //Console.WriteLine($\"{createCount}\");\n",
    "\n",
    "        //2、插入示例数据\n",
    "        var insertSql = \n",
    "        \"\"\"\n",
    "        INSERT INTO Student VALUES (1, '张三', 10), (2, '李四', 33), (3, '王五', 66);\n",
    "        \"\"\";\n",
    "\n",
    "        var insertCommand = sqlConnection.CreateCommand();\n",
    "        insertCommand.CommandType = CommandType.Text;\n",
    "        insertCommand.CommandText = insertSql;\n",
    "\n",
    "        var insertCount = insertCommand.ExecuteNonQuery();\n",
    "        //Console.WriteLine($\"{insertCount}\");\n",
    "\n",
    "        //3、查询数据\n",
    "        var querySql = \n",
    "        \"\"\"\n",
    "            SELECT * FROM Student ORDER BY Age\n",
    "        \"\"\";\n",
    "        var queryCommand = sqlConnection.CreateCommand();\n",
    "        queryCommand.CommandType = CommandType.Text;\n",
    "        queryCommand.CommandText = querySql;\n",
    "\n",
    "        using (var reader = await queryCommand.ExecuteReaderAsync())\n",
    "        {\n",
    "            //输出列名\n",
    "            List<string> columnNames = reader.GetColumnSchema().Select(c => c.ColumnName.PadRight(padRightCount)).ToList();\n",
    "            Console.WriteLine(string.Join(\"\", columnNames));\n",
    "\n",
    "            //循环输出行数据\n",
    "            while (await reader.ReadAsync())\n",
    "            {\n",
    "                List<string> rowItemValues = new List<string>(100);\n",
    "                for(int i=0; i<columnNames.Count(); i++)\n",
    "                {\n",
    "                    var valueText = reader.GetValue(i).ToString();\n",
    "                    rowItemValues.Add(valueText.PadRight(padRightCount));\n",
    "                }\n",
    "\n",
    "                Console.WriteLine(string.Join(\"\",rowItemValues));\n",
    "            }\n",
    "        }\n",
    "\n",
    "        sqlConnection.Close();\n",
    "        sqlConnection.Dispose();\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "63376dfe",
   "metadata": {},
   "source": [
    "## 使用 Dapper"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "77e6b7bb",
   "metadata": {},
   "source": [
    "### Dapper 操作 SQL Server 2019"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "3068074b",
   "metadata": {
    "polyglot_notebook": {
     "kernelName": "csharp"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[{\"Id\":1,\"Name\":\"吕宇宁\",\"Age\":74},{\"Id\":2,\"Name\":\"韦子异\",\"Age\":3}]\r\n"
     ]
    }
   ],
   "source": [
    "//Dapper 操作SQL Server\n",
    "{\n",
    "    using(var mssqlConnection = new SqlConnection(SharedDbConnect.MsSqlConnectionString))\n",
    "    {\n",
    "        var querySql = \"select * FROM student;\";\n",
    "        var students = mssqlConnection.Query<Student>(querySql).Take(2);\n",
    "         var jsonText = System.Text.Json.JsonSerializer.Serialize(students, new System.Text.Json.JsonSerializerOptions()\n",
    "        {\n",
    "            Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All),\n",
    "            WriteIndented = false,\n",
    "        });\n",
    "\n",
    "        Console.WriteLine(jsonText);\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d5daa579",
   "metadata": {},
   "source": [
    "###  Dapper 操作 MySQL"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "0cd87012",
   "metadata": {
    "polyglot_notebook": {
     "kernelName": "csharp"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[{\"Id\":1,\"Name\":\"江子韬\",\"Age\":28},{\"Id\":2,\"Name\":\"苏震南\",\"Age\":48}]\r\n"
     ]
    }
   ],
   "source": [
    "//Dapper 操作MySQL\n",
    "{\n",
    "    using(var dbConnection = new MySqlConnection(SharedDbConnect.MySQLConnectionString))\n",
    "    {\n",
    "        var querySql = \"SELECT * FROM `Student` LIMIT @top;\";\n",
    "        var students = dbConnection.Query<Student>(querySql, new {top=2});\n",
    "\n",
    "        var jsonText = System.Text.Json.JsonSerializer.Serialize(students, new System.Text.Json.JsonSerializerOptions()\n",
    "        {\n",
    "            Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All),\n",
    "            WriteIndented = false,\n",
    "        });\n",
    "\n",
    "        Console.WriteLine(jsonText);\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bac2b8e0",
   "metadata": {},
   "source": [
    "###  Dapper 操作 PostgreSQL"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "7a476608",
   "metadata": {
    "polyglot_notebook": {
     "kernelName": "csharp"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[{\"Id\":1,\"Name\":\"邵致远\",\"Age\":62},{\"Id\":3,\"Name\":\"陶震南\",\"Age\":60}]\r\n"
     ]
    }
   ],
   "source": [
    "//Dapper 操作 PSQL\n",
    "{\n",
    "    using(var dbConnection = new NpgsqlConnection(SharedDbConnect.PSQLConnectionString))\n",
    "    {\n",
    "        var querySql = \"SELECT * FROM \\\"Student\\\" Where \\\"Age\\\" > @Age LIMIT @Top;\";\n",
    "        var students = dbConnection.Query<Student>(querySql, new {Age = 50, top = 2});\n",
    "\n",
    "        var jsonText = System.Text.Json.JsonSerializer.Serialize(students, new System.Text.Json.JsonSerializerOptions()\n",
    "        {\n",
    "            Encoder = System.Text.Encodings.Web.JavaScriptEncoder.Create(System.Text.Unicode.UnicodeRanges.All),\n",
    "            WriteIndented = false,\n",
    "        });\n",
    "\n",
    "        Console.WriteLine(jsonText);\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9075b64b",
   "metadata": {},
   "source": [
    "## 使用 EF Core"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "047da44c",
   "metadata": {
    "polyglot_notebook": {
     "kernelName": "csharp"
    }
   },
   "outputs": [],
   "source": [
    "//共享\n",
    "/// <summary>\n",
    "///  SQL Server DbContext\n",
    "/// </summary>\n",
    "public class StudyDbContext: DbContext\n",
    "{\n",
    "    public StudyDbContext(DbContextOptions<StudyDbContext> option):base(option)\n",
    "    {\n",
    "\n",
    "    }\n",
    "\n",
    "    public DbSet<Student> Student {get; set;}\n",
    "\n",
    "    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)\n",
    "    {\n",
    "        base.OnConfiguring(optionsBuilder);\n",
    "        if(!optionsBuilder.IsConfigured)\n",
    "        {\n",
    "                Console.WriteLine(\"没有设置\");\n",
    "        }\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3c61973d",
   "metadata": {},
   "source": [
    "### EF Core 操作 SQL Server\n",
    " "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "6da513fd",
   "metadata": {
    "polyglot_notebook": {
     "kernelName": "csharp"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>33</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>戴嘉伦</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>1</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>45</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>曾震南</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>98</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>2</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>55</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>丁子韬</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>3</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>65</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>冯宇宁</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>4</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>167</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>严睿</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>5</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>199</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>孔秀英</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>6</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>232</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>王睿</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>7</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>305</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>董子异</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>8</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>318</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>许晓明</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>9</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>329</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>孟宇宁</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>10</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>338</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>陶秀英</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>11</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>382</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>袁云熙</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>12</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>400</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>戴安琪</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>13</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>413</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>尹詩涵</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>14</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>436</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>罗岚</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>15</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>439</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>陆岚</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>16</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>444</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>戴璐</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>17</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>457</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>谢岚</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>18</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>477</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>卢杰宏</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>19</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>482</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>萧杰宏</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>100</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td colspan=\"2\"><i>(23 more)</i></td></tr></tbody></table><style>\r\n",
       ".dni-code-hint {\r\n",
       "    font-style: italic;\r\n",
       "    overflow: hidden;\r\n",
       "    white-space: nowrap;\r\n",
       "}\r\n",
       ".dni-treeview {\r\n",
       "    white-space: nowrap;\r\n",
       "}\r\n",
       ".dni-treeview td {\r\n",
       "    vertical-align: top;\r\n",
       "    text-align: start;\r\n",
       "}\r\n",
       "details.dni-treeview {\r\n",
       "    padding-left: 1em;\r\n",
       "}\r\n",
       "table td {\r\n",
       "    text-align: start;\r\n",
       "}\r\n",
       "table tr { \r\n",
       "    vertical-align: top; \r\n",
       "    margin: 0em 0px;\r\n",
       "}\r\n",
       "table tr td pre \r\n",
       "{ \r\n",
       "    vertical-align: top !important; \r\n",
       "    margin: 0em 0px !important;\r\n",
       "} \r\n",
       "table th {\r\n",
       "    text-align: start;\r\n",
       "}\r\n",
       "</style>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "{   //EF Core SQL Server\n",
    "    var builder = new DbContextOptionsBuilder<StudyDbContext>();\n",
    "    builder.UseSqlServer(SharedDbConnect.MsSqlConnectionString);\n",
    "\n",
    "    var dbContext = new StudyDbContext(builder.Options);\n",
    "    var students = dbContext.Student.Where(s => s.Age> 95).ToList();\n",
    "    students.Display();\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c4b85b82",
   "metadata": {},
   "source": [
    "### EF Core 查询 MySQL"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "9d5dc22b",
   "metadata": {
    "polyglot_notebook": {
     "kernelName": "csharp"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>26</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>邱璐</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>98</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>1</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>58</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>曾致远</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>2</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>59</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>苏秀英</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>3</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>80</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>廖詩涵</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>4</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>顾岚</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>98</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>5</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>148</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>金震南</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>6</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>172</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>武秀英</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>7</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>246</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>金云熙</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>8</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>268</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>董秀英</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>9</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>281</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>梁震南</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>98</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>10</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>313</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>阎子异</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>11</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>321</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>顾嘉伦</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>12</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>329</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>钟子韬</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>13</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>378</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>叶璐</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>14</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>394</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>邹致远</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>15</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>436</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>李子异</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>16</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>480</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>马晓明</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>17</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>482</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>贺睿</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>18</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>484</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>朱嘉伦</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>98</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>19</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>548</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>龚震南</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td colspan=\"2\"><i>(27 more)</i></td></tr></tbody></table><style>\r\n",
       ".dni-code-hint {\r\n",
       "    font-style: italic;\r\n",
       "    overflow: hidden;\r\n",
       "    white-space: nowrap;\r\n",
       "}\r\n",
       ".dni-treeview {\r\n",
       "    white-space: nowrap;\r\n",
       "}\r\n",
       ".dni-treeview td {\r\n",
       "    vertical-align: top;\r\n",
       "    text-align: start;\r\n",
       "}\r\n",
       "details.dni-treeview {\r\n",
       "    padding-left: 1em;\r\n",
       "}\r\n",
       "table td {\r\n",
       "    text-align: start;\r\n",
       "}\r\n",
       "table tr { \r\n",
       "    vertical-align: top; \r\n",
       "    margin: 0em 0px;\r\n",
       "}\r\n",
       "table tr td pre \r\n",
       "{ \r\n",
       "    vertical-align: top !important; \r\n",
       "    margin: 0em 0px !important;\r\n",
       "} \r\n",
       "table th {\r\n",
       "    text-align: start;\r\n",
       "}\r\n",
       "</style>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "{   //EF Core MySQL\n",
    "    var builder = new DbContextOptionsBuilder<StudyDbContext>();\n",
    "    builder.UseMySQL(SharedDbConnect.MySQLConnectionString);\n",
    "\n",
    "    var dbContext = new StudyDbContext(builder.Options);\n",
    "    var students = dbContext.Student.Where(s => s.Age> 95).ToList();\n",
    "    students.Display();\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "81d3e14d",
   "metadata": {},
   "source": [
    "### EFCore PostgreSQL"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "42dd5655",
   "metadata": {
    "polyglot_notebook": {
     "kernelName": "csharp"
    }
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<table><thead><tr><th><i>index</i></th><th>value</th></tr></thead><tbody><tr><td>0</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>11</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>张子异</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>98</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>1</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>19</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>范璐</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>2</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>51</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>贾震南</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>3</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>54</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>董子异</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>4</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>60</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>张安琪</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>98</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>5</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>81</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>郭震南</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>6</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>86</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>罗璐</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>7</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>94</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>贺睿</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>8</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>100</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>钱睿</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>9</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>164</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>苏睿</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>10</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>211</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>杜睿</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>98</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>11</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>238</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>孔詩涵</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>98</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>12</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>263</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>贾子韬</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>13</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>310</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>毛震南</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>14</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>322</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>方宇宁</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>15</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>357</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>尹晓明</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>16</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>380</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>张震南</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>97</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>17</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>434</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>徐子异</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>99</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>18</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>468</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>姚子异</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>96</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td>19</td><td><details class=\"dni-treeview\"><summary><span class=\"dni-code-hint\"><code>Submission#17+Student</code></span></summary><div><table><thead><tr></tr></thead><tbody><tr><td>Id</td><td><div class=\"dni-plaintext\"><pre>524</pre></div></td></tr><tr><td>Name</td><td><div class=\"dni-plaintext\"><pre>顾璐</pre></div></td></tr><tr><td>Age</td><td><div class=\"dni-plaintext\"><pre>98</pre></div></td></tr></tbody></table></div></details></td></tr><tr><td colspan=\"2\"><i>(18 more)</i></td></tr></tbody></table><style>\r\n",
       ".dni-code-hint {\r\n",
       "    font-style: italic;\r\n",
       "    overflow: hidden;\r\n",
       "    white-space: nowrap;\r\n",
       "}\r\n",
       ".dni-treeview {\r\n",
       "    white-space: nowrap;\r\n",
       "}\r\n",
       ".dni-treeview td {\r\n",
       "    vertical-align: top;\r\n",
       "    text-align: start;\r\n",
       "}\r\n",
       "details.dni-treeview {\r\n",
       "    padding-left: 1em;\r\n",
       "}\r\n",
       "table td {\r\n",
       "    text-align: start;\r\n",
       "}\r\n",
       "table tr { \r\n",
       "    vertical-align: top; \r\n",
       "    margin: 0em 0px;\r\n",
       "}\r\n",
       "table tr td pre \r\n",
       "{ \r\n",
       "    vertical-align: top !important; \r\n",
       "    margin: 0em 0px !important;\r\n",
       "} \r\n",
       "table th {\r\n",
       "    text-align: start;\r\n",
       "}\r\n",
       "</style>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "{   \n",
    "    var builder = new DbContextOptionsBuilder<StudyDbContext>();\n",
    "    builder.UseNpgsql(SharedDbConnect.PSQLConnectionString);\n",
    "\n",
    "    var dbContext = new StudyDbContext(builder.Options);\n",
    "    var students = dbContext.Student.Where(s => s.Age> 95).ToList();\n",
    "    students.Display();\n",
    "}"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": ".NET (C#)",
   "language": "C#",
   "name": ".net-csharp"
  },
  "polyglot_notebook": {
   "kernelInfo": {
    "defaultKernelName": "csharp",
    "items": [
     {
      "aliases": [],
      "languageName": "csharp",
      "name": "csharp"
     }
    ]
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}