From 43d3ec49844531bb7d21a27a86706be9c38e12e3 Mon Sep 17 00:00:00 2001 From: queyongzhen <14089735+queyongzhen@user.noreply.gitee.com> Date: Sun, 15 Dec 2024 19:16:26 +0800 Subject: [PATCH] =?UTF-8?q?12.13=E4=BD=9C=E4=B8=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5\346\225\260\346\215\256\345\272\223).md" | 125 ++++++++++++++++++ ...a\350\241\250\350\276\276\345\274\217).md" | 86 ++++++++++++ ...a\350\241\250\350\276\276\345\274\217).md" | 108 +++++++++++++++ 3 files changed, 319 insertions(+) create mode 100644 "\351\230\231\346\263\263\347\217\215/20241209(\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223).md" create mode 100644 "\351\230\231\346\263\263\347\217\215/20241211(Lambda\350\241\250\350\276\276\345\274\217).md" create mode 100644 "\351\230\231\346\263\263\347\217\215/20241213(Lambda\350\241\250\350\276\276\345\274\217).md" diff --git "a/\351\230\231\346\263\263\347\217\215/20241209(\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223).md" "b/\351\230\231\346\263\263\347\217\215/20241209(\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223).md" new file mode 100644 index 0000000..3204cdf --- /dev/null +++ "b/\351\230\231\346\263\263\347\217\215/20241209(\350\277\236\346\216\245\346\225\260\346\215\256\345\272\223).md" @@ -0,0 +1,125 @@ +## 数据库模型与实践 +### 1. 基本概念 +* 数据库中的每个表都可以映射到程序中的一个模型类。 +* 表中的一条记录在程序中表现为一个对象。 +* 多条记录则表现为一个对象集合。 + + + +### 2. 常见数据库种类 +* **商业数据库** : +* Microsoft SQL Server:微软产品。 +* Oracle:性能稳定。 +* Sybase:商业数据库。 +* IBM DB2:商业数据库。 +* **开源数据库** : +* PostgreSQL:开源社区驱动的数据库。 +* MySQL/MariaDB:企业维护。 +* 达梦数据库:国产数据库。 +* 人大金仓:国产数据库。 +* **非关系型数据库** : +* Redis:开源的非关系型数据库。 +* Memcached:轻量级开源非关系型数据库。 +* MongoDB:开源非关系型数据库。 + + + +### 3. 常见ORM工具 +* Dapper:高效轻量,但需要手动书写代码。 +* Entity Framework Core(EF Core):微软产品,易于使用,但性能稍慢。 + * 数据库优先(曾流行) + * 代码优先(主流方法) + * 定义模型 + * 生成迁移文件 + * 应用迁移到数据库 +* FreeSql:开源的ORM工具。 +* Hibernate:经典开源ORM框架。 + + + +### 4. 数据库连接步骤 +* 安装 Entity Framework Core。 +* 定义模型。 +* 创建数据库上下文类(例如:`public DbSet Books { get; set; }`)。 +* 配置数据库连接(例如:设置数据库地址、用户名和密码)。 +* 数据迁移: + * 创建迁移文件:`dotnet ef migrations add InitialCreate` + * 更新数据库:`dotnet ef database update` +* 执行数据库操作。 + + + + +### 5. 具体操作步骤 +#### 1. 安装必要的包 +``` +# 安装数据库驱动包: +dotnet add package Microsoft.EntityFrameworkCore.SqlServer + +# 安装成功后,会在项目文件(例如:.csproj 文件)中显示: + + + +``` + +#### 2. 定义模型类 +``` +// 定义实体类 Blogs +namespace Blog.Models; + +public class Blogs { + public int Id { get; set; } + public string Name { get; set; } = null!; + public int Age { get; set; } +} +``` + +#### 3. 定义数据库上下文 +``` +using Microsoft.EntityFrameworkCore; + +namespace Blog.Models; + +// 定义数据库上下文类 +public class BlogDbContext : DbContext { + public DbSet Blogs { get; set; } = null!; + + public BlogDbContext(DbContextOptions options) : base(options) {} +} +``` + + +#### 4. 配置数据库连接 +``` +// 在 Program.cs 中添加配置: +using Blog.Models; +using Microsoft.EntityFrameworkCore; + +var connectionString = $"Server=.\\SQLEXPRESS;Database=MdBlog;uid=sa;pwd=123456;TrustServerCertificate=true;"; + +builder.Services.AddDbContext(options => { + options.UseSqlServer(connectionString); +}); +``` + + +#### 5. 数据库迁移 +``` +# 安装 dotnet ef 工具 +dotnet tool install --global dotnet-ef + +# 创建迁移文件 +dotnet ef migrations add InitialCreate + +# 更新数据库 +dotnet ef database update +``` + + +#### 6. 处理常见问题 +* 报错:找不到 `dotnet ef` 命令 + * 解决:安装工具 `dotnet tool install --global dotnet-ef`。 +* 报错:缺少 `Microsoft.EntityFrameworkCore.Design` 包 + * 解决:安装包 `dotnet add package Microsoft.EntityFrameworkCore.Design`。 +* 迁移时提示资源被锁定 + * 解决:关闭运行中的程序,或在任务管理器中结束相关进程。 diff --git "a/\351\230\231\346\263\263\347\217\215/20241211(Lambda\350\241\250\350\276\276\345\274\217).md" "b/\351\230\231\346\263\263\347\217\215/20241211(Lambda\350\241\250\350\276\276\345\274\217).md" new file mode 100644 index 0000000..ec52af0 --- /dev/null +++ "b/\351\230\231\346\263\263\347\217\215/20241211(Lambda\350\241\250\350\276\276\345\274\217).md" @@ -0,0 +1,86 @@ +## Lambda表达式 + +**概念** : + +Lambda表达式(也称为匿名函数或lambda函数)是C#中引入的一种简洁的匿名函数语法。它们允许你以简洁的方式编写内联函数,这些函数可以被赋值给变量、作为参数传递或在表达式树中使用。 + + **组成** : + +1. **Lambda关键字** :大多数语言中使用 `lambda`来标识一个匿名函数。 +2. **参数列表** :定义了lambda函数可以接受的参数。 +3. **箭头(->)** :在某些语言中,如Java和C#,使用箭头来分隔参数列表和函数体。 +4. **函数体** :定义了当lambda函数被调用时应该执行的操作。在许多语言中,函数体可以是一个表达式,也可以是一个代码块。 + +## Linq查询 + +* 1. 查询表达式是一种使用查询语法表示的表达式,它用于查询和转换来自任意支持LINQ的数据源中的数据。 +* 2. 查询表达式使用常见的C#语言构造,易读简洁,容易掌握。 +* 3. 它由一组类似于SQL或XQuery的声明性语法编写的子句组成。 +* 4. 每一个子句可以包含一个或多个C#表达式,这些C#表达式本身也可能是查询表达式或包含查询表达式。 + +## 方法语法 + +### Where 方法 + +Where:根据条件过滤元素 + +``` +var filtered = list.Where(item => item.SomeProperty > 10).ToList(); +``` + +### Select(选择/投影) 方法 + +Select:将每个元素转换成另一种形式。 + +``` +var projected = list.Select(item => item.SomeProperty).ToList(); +``` + +### Aggregate(聚合) + +* **Sum** :计算数值序列的总和。 + +``` +int total = list.Sum(item => item.SomeProperty); +``` + +* **Average** :计算数值序列的平均值。 + +``` +double average = list.Average(item => item.SomeProperty); +``` + +* **Min** :找到序列中的最小值。 + +``` +int min = list.Min(item => item.SomeProperty); +``` + +* **Max** :找到序列中的最大值。 + +``` +int max = list.Max(item => item.SomeProperty); +``` + +### Convert(转换) + +* ToArray 方法 + 将序列转换为数组。 + +``` +var array = dataSource.ToArray(); +``` + +* ToList 方法 + 将序列转换为列表。 + +``` +var list = dataSource.ToList(); +``` + +## 其他常用方法 + +* **FirstOrDefault** :返回序列中的第一个元素,或者如果序列为空,则返回默认值。 +* **LastOrDefault** :返回序列中的最后一个元素,或者如果序列为空,则返回默认值。 +* **SingleOrDefault** :返回序列中的单一元素,或者如果序列为空或包含多于一个元素,则返回默认值。 +* **ElementAtOrDefault** :返回序列中指定索引位置的元素,或者如果索引超出范围,则返回默认值。 diff --git "a/\351\230\231\346\263\263\347\217\215/20241213(Lambda\350\241\250\350\276\276\345\274\217).md" "b/\351\230\231\346\263\263\347\217\215/20241213(Lambda\350\241\250\350\276\276\345\274\217).md" new file mode 100644 index 0000000..af3bcc8 --- /dev/null +++ "b/\351\230\231\346\263\263\347\217\215/20241213(Lambda\350\241\250\350\276\276\345\274\217).md" @@ -0,0 +1,108 @@ +## Lambda表达式2 +### 字符串操作 +* **StartsWith** :检查字符串是否以指定前缀开头。 +``` +bool startsWithPrefix = someString.StartsWith("prefix"); +``` + + +### 排序 +* **OrderByDescending** :降序排序。 +``` +var sortedDescending = list.OrderByDescending(item => item.SomeProperty).ToList(); +``` + +* **OrderBy** :升序排序。 +``` +var sortedAscending = list.OrderBy(item => item.SomeProperty).ToList(); +``` + + +### 去重 +* **Distinct** :移除重复元素。 +``` +var distinctItems = list.Distinct().ToList(); +``` + + +### 获取元素 +* **LastOrDefault** :获取最后一个元素,或返回默认值。 +``` +var lastOrDefaultItem = list.LastOrDefault(item => item.SomeProperty > 10); +``` + + +### 存在性检查 +* **Array.Exists** :判断数组中是否存在指定元素。 +``` +bool exists = Array.Exists(array, element => element.SomeProperty == someValue); +``` + + +### 计数 +* **Count** :获取元素总数。 +``` +int count = list.Count(); +``` + + + +### 分组和计数 +* **GroupBy + Select + Count** :按属性分组并统计数量。 +``` +var grouped = students.GroupBy(s => s.Age).Select(g => new { Age = g.Key, Count = g.Count() }).ToList(); +``` + + +### 反转序列 +* **Reverse** :反转序列。 +``` +var reversed = list.Reverse().ToList(); +``` + + +### 替换 null 值 +* **Select with null-coalescing** :替换 null 值为默认值。 +``` +var replaced = numbers.Select(n => n ?? 0).ToList(); +``` + + +### 类型转换 +* **Select with parsing** :类型转换。 +``` +int[] intNumbers = strNumbers.Select(n => int.Parse(n)).ToArray(); +``` + + +### 筛选类型 +* **OfType``** :筛选指定类型的元素。 +``` +var strings = mixedArray.OfType().ToList(); +``` + + +### 创建范围数组 +* **Enumerable.Range** :创建范围数组。 +``` +int[] range = Enumerable.Range(1, 10).ToArray(); +``` + + +### 重复生成元素 +* **Enumerable.Repeat** :重复生成元素。 +``` +int[] repeated = Enumerable.Repeat(7, 5).ToArray(); +``` + + +### 获取和跳过元素 +* **Take** :获取前 N 个元素。 +``` +var topFive = arr.Take(5).ToList(); +``` + +* **Skip** :跳过前 N 个元素。 +``` +var remaining = arr.Skip(3).ToList(); +``` -- Gitee