From 42ad3afccaf7f276a387680b840dc3feaf7507ff Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=99=88=E6=80=9D=E7=9D=BF?= <3282028831@qq.com>
Date: Sun, 8 Dec 2024 17:59:05 +0800
Subject: [PATCH 1/4] =?UTF-8?q?12.04=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\351\231\244,\346\237\245\346\211\276).md" | 185 +++++++++++++++++
...6\346\210\220\346\237\245\350\257\242).md" | 193 ++++++++++++++++++
2 files changed, 378 insertions(+)
create mode 100644 "\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md"
create mode 100644 "\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md"
diff --git "a/\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" "b/\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md"
new file mode 100644
index 0000000..13031e0
--- /dev/null
+++ "b/\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md"
@@ -0,0 +1,185 @@
+## 删除操作
+
+### 控制器中的处理逻辑
+
+#### 1. 渲染删除页面
+- **操作**:根据传入的 `id` 在数据库表中查找对应记录。
+- **逻辑**:
+ - 如果找到记录,则返回元素供用户确认删除。
+ - 如果找不到记录,则提示用户目标不存在。
+- **示例代码**:
+ ```cs
+ public IActionResult Delete(int id)
+ {
+ var blog = Db.Blogs.FirstOrDefault(b => b.Id == id);
+ if (blog != null)
+ {
+ return View(blog);
+ }
+ return View();
+ }
+ ```
+
+#### 2. 执行删除操作
+- **操作**:再次通过 `id` 查找记录,找到后执行删除。
+- **示例代码**:
+ ```cs
+ public IActionResult DeleteOther(int id)
+ {
+ var blog = Db.Blogs.FirstOrDefault(b => b.Id == id);
+ if (blog != null)
+ {
+ Db.Blogs.Remove(blog);
+ }
+ return RedirectToAction("Index");
+ }
+ ```
+
+---
+
+### 视图中的实现
+
+1. **展示要删除的记录**:页面显示记录的详细信息。
+2. **确认删除**:提供跳转链接,执行实际删除操作。
+ ```html
+ 删除
+ ```
+3. **取消操作**:返回首页。
+ ```html
+ 取消删除
+ ```
+
+---
+
+## 查找功能
+
+### 视图层实现
+
+1. **添加搜索框**:在主页视图中加入表单,连接到控制器的 `Index` 方法。
+ ```html
+
+ ```
+
+### 控制器逻辑
+
+1. **处理搜索请求**:
+ - 判断是否有关键字输入。
+ - 如果没有关键字,则显示所有内容。
+ - 如果有关键字,则匹配相关数据并返回结果。
+ ```cs
+ public IActionResult Index(string keyword)
+ {
+ if (string.IsNullOrEmpty(keyword))
+ {
+ return View(Db.Blogs);
+ }
+ else
+ {
+ var list = Db.Blogs
+ .Where(x => x.Title.Contains(keyword) || x.Content.Contains(keyword) || x.Author.Contains(keyword))
+ .ToList();
+ return View(list);
+ }
+ }
+ ```
+
+---
+
+## LINQ 查询与 Lambda 表达式
+
+### 基础操作示例
+
+1. **查询特定元素**:获取数组中等于 5 的值。
+ ```cs
+ var result = numbers.Where(x => x == 5);
+ ```
+
+2. **筛选范围元素**:找出 2 到 8 之间的数字。
+ ```cs
+ var result = numbers.Where(x => x > 2 && x < 8);
+ ```
+
+3. **数据转换**:将数组中的每个数字乘以 2。
+ ```cs
+ var result = numbers.Select(x => x * 2);
+ ```
+
+4. **筛选特定属性**:获取名字以“王”开头的学生。
+ ```cs
+ var result = students.Where(x => x.Name.StartsWith("王"));
+ ```
+
+5. **排序**:找出年龄大于 20 的学生并按年龄降序排列。
+ ```cs
+ var result = students.Where(x => x.Age > 20).OrderByDescending(x => x.Age);
+ ```
+
+6. **去重**:获取数组中所有不重复的数字。
+ ```cs
+ var result = numbers.Distinct();
+ ```
+
+---
+
+### 进阶操作示例
+
+1. **分组统计**:按年龄分组学生并计算每组人数。
+ ```cs
+ var result = students.GroupBy(x => x.Age)
+ .Select(g => new { Age = g.Key, Count = g.Count() });
+ ```
+
+2. **关联查询**:联结学生和课程,返回学生的所有课程。
+ ```cs
+ var result = students.Join(courses,
+ s => s.Id,
+ c => c.StudentId,
+ (student, course) => new { student.Name, course.CourseName });
+ ```
+
+3. **翻转顺序**:将数组反转。
+ ```cs
+ var result = numbers.Reverse();
+ ```
+
+4. **限制元素数量**:获取前 5 个数字。
+ ```cs
+ var result = numbers.Take(5);
+ ```
+
+5. **跳过元素**:跳过前 3 个数字,获取剩余的内容。
+ ```cs
+ var result = numbers.Skip(3);
+ ```
+
+---
+
+### 高级操作示例
+
+1. **合并数组**:使用 `Zip` 合并两个数组,生成新数组。
+ ```cs
+ var result = numbers1.Zip(numbers2, (x, y) => $"{x} {y}");
+ ```
+
+2. **生成序列**:创建包含从 1 到 10 的数组。
+ ```cs
+ var result = Enumerable.Range(1, 10);
+ ```
+
+3. **重复元素**:将一个元素重复多次,生成新数组。
+ ```cs
+ var result = Enumerable.Repeat("元素", 10);
+ ```
+
+4. **过滤特定类型**:从对象数组中过滤出字符串类型的值。
+ ```cs
+ var result = objects.OfType();
+ ```
+
+
+
+
+
diff --git "a/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" "b/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md"
new file mode 100644
index 0000000..737ecde
--- /dev/null
+++ "b/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md"
@@ -0,0 +1,193 @@
+# 实现编辑功能
+
+### 控制器中的实现
+
+#### 1. 获取要编辑的记录
+通过传入的 `Id` 从数据库中查询对应的记录,如果找到则返回用于编辑;否则直接返回列表页。
+```csharp
+public IActionResult Edit(int id)
+{
+ // 从数据库中查找目标记录
+ var blog = Db.Blogs.FirstOrDefault(b => b.Id == id);
+
+ // 将记录传递给视图进行编辑
+ return View(blog);
+}
+```
+
+#### 2. 提交编辑后的数据
+通过 POST 请求接收用户修改后的内容,并将其保存到数据库中。
+- 如果输入有效且记录存在,则更新数据并保存。
+- 如果未找到记录,则返回到列表页。
+```csharp
+[HttpPost]
+[ValidateAntiForgeryToken]
+public IActionResult Edit(Blog input)
+{
+ var blog = Db.Blogs.FirstOrDefault(b => b.Id == input.Id);
+ if (blog != null)
+ {
+ // 更新记录的字段
+ blog.Title = input.Title;
+ blog.Content = input.Content;
+ blog.Author = input.Author;
+ }
+
+ // 保存后跳转到首页
+ return RedirectToAction("Index");
+}
+```
+
+---
+
+### 视图中的实现
+
+编辑界面使用表单提交修改内容,内容结构与新增页面类似:
+```html
+@model Blog.Models.Blog
+
+
+```
+
+---
+
+# 集成 LINQ 查询
+
+LINQ 是一种用于操作集合的强大工具,通常用于实现高效的查询和数据处理。
+
+### 查询单个元素
+- **获取首个匹配项**:`First()` 会返回符合条件的第一个元素,如果不存在则抛出异常。
+- **安全获取**:`FirstOrDefault()` 如果未找到匹配项,则返回 `null`。
+```csharp
+var blog = Db.Blogs.FirstOrDefault(b => b.Id == id);
+```
+
+### 查询多个元素
+- **筛选条件**:`Where()` 方法可根据条件返回多个匹配项。
+```csharp
+var blogs = Db.Blogs.Where(b => b.Author == "张三" && b.Id > 10);
+```
+
+### 返回指定字段
+- **映射结果**:使用 `Select()` 返回处理后的字段集合。
+```csharp
+var result = Db.Blogs.Select(b => new { BlogId = b.Id, Writer = b.Author });
+```
+
+---
+
+# 综合功能实现示例
+
+## 删除功能
+### 删除视图
+```html
+@model Blog.Models.Blog
+
+
+
+ | 标题: |
+ @Model.Title |
+
+
+ | 内容: |
+ @Model.Content |
+
+
+ | 作者: |
+ @Model.Author |
+
+
+ |
+ 确认删除
+ |
+
+ 取消
+ |
+
+
+```
+
+### 控制器实现
+```csharp
+public IActionResult ConfirmDelete(int id)
+{
+ var blog = Db.Blogs.FirstOrDefault(b => b.Id == id);
+ if (blog != null)
+ {
+ Db.Blogs.Remove(blog);
+ }
+ return RedirectToAction("Index");
+}
+```
+
+---
+
+## 新增功能
+### 新增视图
+```html
+@model Blog.Models.Blog
+
+
+```
+
+### 控制器实现
+```csharp
+public IActionResult Create()
+{
+ return View();
+}
+
+[HttpPost]
+public IActionResult Create(Blog input)
+{
+ if (ModelState.IsValid)
+ {
+ input.Id = Db.Blogs.Max(b => b.Id) + 1; // 自动生成新 ID
+ Db.Blogs.Add(input);
+ return RedirectToAction("Index");
+ }
+ return View(input);
+}
+```
+
+---
+
+## 搜索功能
+### 搜索视图
+```html
+
+
+
+```
+
+### 控制器实现
+```csharp
+public IActionResult Index(string keyword)
+{
+ if (string.IsNullOrWhiteSpace(keyword))
+ {
+ return View(Db.Blogs);
+ }
+ else
+ {
+ var results = Db.Blogs.Where(b =>
+ b.Title.Contains(keyword) ||
+ b.Content.Contains(keyword) ||
+ b.Author.Contains(keyword)).ToList();
+ return View(results);
+ }
+}
\ No newline at end of file
--
Gitee
From 3fe967615e57acb579813f5b1ec421fb2a0db0f5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=99=88=E6=80=9D=E7=9D=BF?= <3282028831@qq.com>
Date: Sun, 8 Dec 2024 10:15:01 +0000
Subject: [PATCH 2/4] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?=
=?UTF-8?q?=E9=99=88=E6=80=9D=E7=9D=BF/20241202-(=E5=88=A0=E9=99=A4,?=
=?UTF-8?q?=E6=9F=A5=E6=89=BE).md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\351\231\244,\346\237\245\346\211\276).md" | 185 ------------------
1 file changed, 185 deletions(-)
delete mode 100644 "\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md"
diff --git "a/\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" "b/\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md"
deleted file mode 100644
index 13031e0..0000000
--- "a/\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md"
+++ /dev/null
@@ -1,185 +0,0 @@
-## 删除操作
-
-### 控制器中的处理逻辑
-
-#### 1. 渲染删除页面
-- **操作**:根据传入的 `id` 在数据库表中查找对应记录。
-- **逻辑**:
- - 如果找到记录,则返回元素供用户确认删除。
- - 如果找不到记录,则提示用户目标不存在。
-- **示例代码**:
- ```cs
- public IActionResult Delete(int id)
- {
- var blog = Db.Blogs.FirstOrDefault(b => b.Id == id);
- if (blog != null)
- {
- return View(blog);
- }
- return View();
- }
- ```
-
-#### 2. 执行删除操作
-- **操作**:再次通过 `id` 查找记录,找到后执行删除。
-- **示例代码**:
- ```cs
- public IActionResult DeleteOther(int id)
- {
- var blog = Db.Blogs.FirstOrDefault(b => b.Id == id);
- if (blog != null)
- {
- Db.Blogs.Remove(blog);
- }
- return RedirectToAction("Index");
- }
- ```
-
----
-
-### 视图中的实现
-
-1. **展示要删除的记录**:页面显示记录的详细信息。
-2. **确认删除**:提供跳转链接,执行实际删除操作。
- ```html
- 删除
- ```
-3. **取消操作**:返回首页。
- ```html
- 取消删除
- ```
-
----
-
-## 查找功能
-
-### 视图层实现
-
-1. **添加搜索框**:在主页视图中加入表单,连接到控制器的 `Index` 方法。
- ```html
-
- ```
-
-### 控制器逻辑
-
-1. **处理搜索请求**:
- - 判断是否有关键字输入。
- - 如果没有关键字,则显示所有内容。
- - 如果有关键字,则匹配相关数据并返回结果。
- ```cs
- public IActionResult Index(string keyword)
- {
- if (string.IsNullOrEmpty(keyword))
- {
- return View(Db.Blogs);
- }
- else
- {
- var list = Db.Blogs
- .Where(x => x.Title.Contains(keyword) || x.Content.Contains(keyword) || x.Author.Contains(keyword))
- .ToList();
- return View(list);
- }
- }
- ```
-
----
-
-## LINQ 查询与 Lambda 表达式
-
-### 基础操作示例
-
-1. **查询特定元素**:获取数组中等于 5 的值。
- ```cs
- var result = numbers.Where(x => x == 5);
- ```
-
-2. **筛选范围元素**:找出 2 到 8 之间的数字。
- ```cs
- var result = numbers.Where(x => x > 2 && x < 8);
- ```
-
-3. **数据转换**:将数组中的每个数字乘以 2。
- ```cs
- var result = numbers.Select(x => x * 2);
- ```
-
-4. **筛选特定属性**:获取名字以“王”开头的学生。
- ```cs
- var result = students.Where(x => x.Name.StartsWith("王"));
- ```
-
-5. **排序**:找出年龄大于 20 的学生并按年龄降序排列。
- ```cs
- var result = students.Where(x => x.Age > 20).OrderByDescending(x => x.Age);
- ```
-
-6. **去重**:获取数组中所有不重复的数字。
- ```cs
- var result = numbers.Distinct();
- ```
-
----
-
-### 进阶操作示例
-
-1. **分组统计**:按年龄分组学生并计算每组人数。
- ```cs
- var result = students.GroupBy(x => x.Age)
- .Select(g => new { Age = g.Key, Count = g.Count() });
- ```
-
-2. **关联查询**:联结学生和课程,返回学生的所有课程。
- ```cs
- var result = students.Join(courses,
- s => s.Id,
- c => c.StudentId,
- (student, course) => new { student.Name, course.CourseName });
- ```
-
-3. **翻转顺序**:将数组反转。
- ```cs
- var result = numbers.Reverse();
- ```
-
-4. **限制元素数量**:获取前 5 个数字。
- ```cs
- var result = numbers.Take(5);
- ```
-
-5. **跳过元素**:跳过前 3 个数字,获取剩余的内容。
- ```cs
- var result = numbers.Skip(3);
- ```
-
----
-
-### 高级操作示例
-
-1. **合并数组**:使用 `Zip` 合并两个数组,生成新数组。
- ```cs
- var result = numbers1.Zip(numbers2, (x, y) => $"{x} {y}");
- ```
-
-2. **生成序列**:创建包含从 1 到 10 的数组。
- ```cs
- var result = Enumerable.Range(1, 10);
- ```
-
-3. **重复元素**:将一个元素重复多次,生成新数组。
- ```cs
- var result = Enumerable.Repeat("元素", 10);
- ```
-
-4. **过滤特定类型**:从对象数组中过滤出字符串类型的值。
- ```cs
- var result = objects.OfType();
- ```
-
-
-
-
-
--
Gitee
From 3f1df96b81bd3aff20b48a79163c6e0fd9f82683 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=99=88=E6=80=9D=E7=9D=BF?= <3282028831@qq.com>
Date: Sun, 8 Dec 2024 10:15:08 +0000
Subject: [PATCH 3/4] =?UTF-8?q?=E5=88=A0=E9=99=A4=E6=96=87=E4=BB=B6=20?=
=?UTF-8?q?=E9=99=88=E6=80=9D=E7=9D=BF/20241204-(=E7=BC=96=E8=BE=91,?=
=?UTF-8?q?=E9=9B=86=E6=88=90=E6=9F=A5=E8=AF=A2).md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...6\346\210\220\346\237\245\350\257\242).md" | 193 ------------------
1 file changed, 193 deletions(-)
delete mode 100644 "\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md"
diff --git "a/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" "b/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md"
deleted file mode 100644
index 737ecde..0000000
--- "a/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md"
+++ /dev/null
@@ -1,193 +0,0 @@
-# 实现编辑功能
-
-### 控制器中的实现
-
-#### 1. 获取要编辑的记录
-通过传入的 `Id` 从数据库中查询对应的记录,如果找到则返回用于编辑;否则直接返回列表页。
-```csharp
-public IActionResult Edit(int id)
-{
- // 从数据库中查找目标记录
- var blog = Db.Blogs.FirstOrDefault(b => b.Id == id);
-
- // 将记录传递给视图进行编辑
- return View(blog);
-}
-```
-
-#### 2. 提交编辑后的数据
-通过 POST 请求接收用户修改后的内容,并将其保存到数据库中。
-- 如果输入有效且记录存在,则更新数据并保存。
-- 如果未找到记录,则返回到列表页。
-```csharp
-[HttpPost]
-[ValidateAntiForgeryToken]
-public IActionResult Edit(Blog input)
-{
- var blog = Db.Blogs.FirstOrDefault(b => b.Id == input.Id);
- if (blog != null)
- {
- // 更新记录的字段
- blog.Title = input.Title;
- blog.Content = input.Content;
- blog.Author = input.Author;
- }
-
- // 保存后跳转到首页
- return RedirectToAction("Index");
-}
-```
-
----
-
-### 视图中的实现
-
-编辑界面使用表单提交修改内容,内容结构与新增页面类似:
-```html
-@model Blog.Models.Blog
-
-
-```
-
----
-
-# 集成 LINQ 查询
-
-LINQ 是一种用于操作集合的强大工具,通常用于实现高效的查询和数据处理。
-
-### 查询单个元素
-- **获取首个匹配项**:`First()` 会返回符合条件的第一个元素,如果不存在则抛出异常。
-- **安全获取**:`FirstOrDefault()` 如果未找到匹配项,则返回 `null`。
-```csharp
-var blog = Db.Blogs.FirstOrDefault(b => b.Id == id);
-```
-
-### 查询多个元素
-- **筛选条件**:`Where()` 方法可根据条件返回多个匹配项。
-```csharp
-var blogs = Db.Blogs.Where(b => b.Author == "张三" && b.Id > 10);
-```
-
-### 返回指定字段
-- **映射结果**:使用 `Select()` 返回处理后的字段集合。
-```csharp
-var result = Db.Blogs.Select(b => new { BlogId = b.Id, Writer = b.Author });
-```
-
----
-
-# 综合功能实现示例
-
-## 删除功能
-### 删除视图
-```html
-@model Blog.Models.Blog
-
-
-
- | 标题: |
- @Model.Title |
-
-
- | 内容: |
- @Model.Content |
-
-
- | 作者: |
- @Model.Author |
-
-
- |
- 确认删除
- |
-
- 取消
- |
-
-
-```
-
-### 控制器实现
-```csharp
-public IActionResult ConfirmDelete(int id)
-{
- var blog = Db.Blogs.FirstOrDefault(b => b.Id == id);
- if (blog != null)
- {
- Db.Blogs.Remove(blog);
- }
- return RedirectToAction("Index");
-}
-```
-
----
-
-## 新增功能
-### 新增视图
-```html
-@model Blog.Models.Blog
-
-
-```
-
-### 控制器实现
-```csharp
-public IActionResult Create()
-{
- return View();
-}
-
-[HttpPost]
-public IActionResult Create(Blog input)
-{
- if (ModelState.IsValid)
- {
- input.Id = Db.Blogs.Max(b => b.Id) + 1; // 自动生成新 ID
- Db.Blogs.Add(input);
- return RedirectToAction("Index");
- }
- return View(input);
-}
-```
-
----
-
-## 搜索功能
-### 搜索视图
-```html
-
-
-
-```
-
-### 控制器实现
-```csharp
-public IActionResult Index(string keyword)
-{
- if (string.IsNullOrWhiteSpace(keyword))
- {
- return View(Db.Blogs);
- }
- else
- {
- var results = Db.Blogs.Where(b =>
- b.Title.Contains(keyword) ||
- b.Content.Contains(keyword) ||
- b.Author.Contains(keyword)).ToList();
- return View(results);
- }
-}
\ No newline at end of file
--
Gitee
From 3e0251c036c20d686c3a364cab0024c331b88dd2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=99=88=E6=80=9D=E7=9D=BF?= <3282028831@qq.com>
Date: Sun, 8 Dec 2024 19:04:18 +0800
Subject: [PATCH 4/4] =?UTF-8?q?12.04=E4=BD=9C=E4=B8=9A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...6\346\210\220\346\237\245\350\257\242).md" | 192 +++++++++++++++++
...\351\231\244,\346\237\245\346\211\276).md" | 192 ++++++++++++-----
...6\346\210\220\346\237\245\350\257\242).md" | 193 ------------------
3 files changed, 336 insertions(+), 241 deletions(-)
create mode 100644 "\351\231\210\346\200\235\347\235\277/20241202-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md"
rename "\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" => "\351\231\210\346\200\235\347\235\277/20241204-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" (47%)
delete mode 100644 "\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md"
diff --git "a/\351\231\210\346\200\235\347\235\277/20241202-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" "b/\351\231\210\346\200\235\347\235\277/20241202-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md"
new file mode 100644
index 0000000..3b066ed
--- /dev/null
+++ "b/\351\231\210\346\200\235\347\235\277/20241202-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md"
@@ -0,0 +1,192 @@
+## 课堂笔记
+
+### 控制器中的编辑操作
+
+1. **显示编辑表单** (`Edit` 方法):
+ - 根据传入的 `id` 参数,使用 LINQ 查询从数据库中检索博客文章。
+ - 如果找到对应的博客文章,将其传递给编辑视图。
+ - 如果未找到,可以重定向到错误页面或列表页。
+
+ ```csharp
+ public IActionResult Edit(int id)
+ {
+ var blog = Db.Blog.FirstOrDefault(x => x.Id == id);
+ if (blog == null)
+ {
+ return NotFound(); // 或者 RedirectToAction("Index") 回到列表页
+ }
+ return View(blog);
+ }
+ ```
+
+2. **处理表单提交** (`Edit` 方法):
+ - 使用 `[HttpPost]` 和 `[ValidateAntiForgeryToken]` 属性来处理表单提交并防止跨站请求伪造。
+ - 检索表单数据并更新数据库中的相应博客文章。
+ - 保存更改并重定向到列表页或显示确认消息。
+
+ ```csharp
+ [HttpPost]
+ [ValidateAntiForgeryToken]
+ public IActionResult Edit(Blog input)
+ {
+ if (ModelState.IsValid)
+ {
+ Db.Blog.Update(input);
+ Db.SaveChanges();
+ return RedirectToAction("Index"); // 重定向到列表页
+ }
+ return View(input);
+ }
+ ```
+
+### 视图中的编辑表单
+
+- 编辑视图通常包含一个表单,允许用户修改博客文章的标题、内容和作者。
+- 使用 `Html.BeginForm` 方法创建表单,并设置 `asp-action` 属性为 "Edit"。
+
+### LINQ 查询优化
+
+1. **查询单个元素**:
+ - `FirstOrDefault` 方法用于安全地查询单个元素,如果没有找到匹配的元素,它将返回 `null` 而不是抛出异常。
+
+2. **查询多个元素**:
+ - `Where` 方法用于查询符合特定条件的元素集合。
+
+3. **选择和投影**:
+ - `Select` 方法用于选择查询结果的一部分或创建新的匿名对象。
+
+### 空值和 null 的区别
+
+- **null**: 在 C# 中,`null` 表示一个空引用,即没有指向任何对象。
+- **空值**: 对于值类型(如 `int`、`double` 等),空值表示没有值。对于引用类型,空值可以是 `null`。
+
+## 课后作业
+
+### 作业一
+```html
+@model List;
+
+
+
+
+
+
+
+
+ | 序号 |
+ 标题 |
+ 内容 |
+ 作者 |
+ 操作 |
+
+
+
+ @foreach (var item in Model)
+ {
+
+ | @item.Id |
+ @item.Title |
+ @item.Content |
+ @item.Author |
+
+ 编辑
+ 删除
+ |
+
+ }
+
+
+
+```
+
+```cs
+// 控制器中的 Index 动作方法,返回博客列表视图
+public IActionResult Index()
+{
+ return View(Db.Blogs); // 将数据库中的博客列表传递给视图
+}
+```
+### 作业二
+```html
+@model Apple.Models.Blogs; // 绑定视图模型为博客模型
+
+
+```
+
+```csharp
+[HttpPost]
+public IActionResult Create(Blogs input)
+{
+ var maxId = Db.Blogs.Select(t => t.Id).Max();
+ input.Id = maxId + 1;
+
+ Db.Blogs.Add(input);
+ Db.SaveChanges(); // 保存更改
+ return RedirectToAction("Index"); // 重定向到博客列表页面
+}
+```
+
+
+### 作业三
+要完成修改功能,你需要两个主要部分:视图(View)和控制器(Controller)动作方法。以下是如何实现编辑博客文章的修改功能的示例:
+
+### 视图(Edit.cshtml)
+
+```html
+@model Apple.Models.Blogs
+
+
+```
+
+在这个视图中,我们使用了 `asp-for` 标签帮助器来绑定模型的属性。注意 `Id` 字段是一个隐藏字段,这样当表单提交时,博客的 ID 也会被发送到服务器。
+
+### 控制器(BlogController.cs)
+
+```csharp
+public IActionResult Edit(int id)
+{
+ var blog = Db.Blogs.FirstOrDefault(b => b.Id == id);
+ if (blog == null)
+ {
+ return NotFound(); // 如果找不到博客,返回 404 错误
+ }
+ return View(blog); // 将博客模型传递给视图
+}
+
+
+[HttpPost]
+[ValidateAntiForgeryToken]
+public IActionResult Edit(int id, Blogs input)
+{
+ if (id != input.Id)
+ {
+ return NotFound(); // 如果 ID 不匹配,返回 404 错误
+ }
+
+ if (ModelState.IsValid)
+ {
+ Db.Blogs.Update(input); // 更新数据库中的博客
+ Db.SaveChanges(); // 保存更改
+ return RedirectToAction("Index"); // 重定向到博客列表页面
+ }
+
+ return View(input); // 如果模型无效,重新显示编辑表单
+}
+```
+
+
+
+
diff --git "a/\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md" "b/\351\231\210\346\200\235\347\235\277/20241204-(\345\210\240\351\231\244,\346\237\245\346\211\276).md"
similarity index 47%
rename from "\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md"
rename to "\351\231\210\346\200\235\347\235\277/20241204-(\345\210\240\351\231\244,\346\237\245\346\211\276).md"
index 13031e0..f2cd61e 100644
--- "a/\351\231\210\346\200\235\347\235\277/20241202-(\345\210\240\351\231\244,\346\237\245\346\211\276).md"
+++ "b/\351\231\210\346\200\235\347\235\277/20241204-(\345\210\240\351\231\244,\346\237\245\346\211\276).md"
@@ -1,3 +1,4 @@
+## 课堂笔记
## 删除操作
### 控制器中的处理逻辑
@@ -87,10 +88,11 @@
```
---
+## 课后作业
## LINQ 查询与 Lambda 表达式
-### 基础操作示例
+### 基础练习
1. **查询特定元素**:获取数组中等于 5 的值。
```cs
@@ -116,68 +118,162 @@
```cs
var result = students.Where(x => x.Age > 20).OrderByDescending(x => x.Age);
```
-
-6. **去重**:获取数组中所有不重复的数字。
- ```cs
- var result = numbers.Distinct();
- ```
+6. **查询并去重**
+找出数组中所有不重复的数字。
+```cs
+var distinctNumbers = numbers.Distinct();
+```
+
+7. **查询第一个元素**
+找出数组中第一个大于 3 的元素。
+```cs
+var firstGreaterThanThree = numbers.First(x => x > 3);
+```
+8. **查询最后一个元素**
+找出数组中最后一个小于 7 的元素。
+```cs
+var lastLessThanSeven = numbers.Last(x => x < 7);
+```
+
+9. **查询元素是否存在**
+检查数组中是否存在大于 10 的元素。
+```cs
+var existsGreaterThanTen = numbers.Any(x => x > 10);
+```
+
+10. **查询元素的计数**
+计算数组中大于 5 的元素数量。
+```cs
+var countGreaterThanFive = numbers.Count(x => x > 5);
+```
+
+11. **查询元素的总和**
+计算数组中所有元素的总和。
+```cs
+var sumOfNumbers = numbers.Sum();
+```
+
+12. **查询元素的最大值**
+找出数组中的最大值。
+```cs
+var maxNumber = numbers.Max();
+```
+
+13. **查询元素的最小值**
+找出数组中的最小值。
+```cs
+var minNumber = numbers.Min();
+```
+
+14. **查询元素的平均值**
+计算数组中所有元素的平均值。
+```cs
+var average = numbers.Average();
+```
+
+15. **查询特定条件的元素**
+找出数组中能被 3 整除的元素。
+```cs
+var divisibleByThree = numbers.Where(x => x % 3 == 0);
+```
---
-### 进阶操作示例
-
-1. **分组统计**:按年龄分组学生并计算每组人数。
- ```cs
- var result = students.GroupBy(x => x.Age)
- .Select(g => new { Age = g.Key, Count = g.Count() });
- ```
-
-2. **关联查询**:联结学生和课程,返回学生的所有课程。
- ```cs
- var result = students.Join(courses,
- s => s.Id,
- c => c.StudentId,
- (student, course) => new { student.Name, course.CourseName });
- ```
-
-3. **翻转顺序**:将数组反转。
- ```cs
- var result = numbers.Reverse();
- ```
-
-4. **限制元素数量**:获取前 5 个数字。
- ```cs
- var result = numbers.Take(5);
- ```
-
-5. **跳过元素**:跳过前 3 个数字,获取剩余的内容。
- ```cs
- var result = numbers.Skip(3);
- ```
-
----
-
-### 高级操作示例
-
-1. **合并数组**:使用 `Zip` 合并两个数组,生成新数组。
+### 中级练习
+
+16. **查询并选择特定属性**
+找出所有学生的姓名和年龄。
+```cs
+var studentDetails = students.Select(s => new { s.Name, s.Age });
+```
+
+17. **查询并分组**
+按年龄分组学生,并计算每个年龄组的学生数量。
+```cs
+var groupedByAge = students.GroupBy(s => s.Age)
+ .Select(group => new { Age = group.Key, Count = group.Count() });
+```
+
+18. **查询并联结**
+联结学生和课程表,找出每个学生的所有课程。
+```cs
+var studentCourses = students.GroupJoin(
+ courses,
+ student => student.Id,
+ course => course.StudentId,
+ (student, studentCourses) => new
+ {
+ StudentName = student.Name,
+ Courses = studentCourses.Select(c => c.CourseName).ToList()
+ });
+```
+
+19. **查询并反转**
+反转数组中的元素顺序。
+```cs
+var reversedNumbers = numbers.Reverse();
+```
+
+20. **查询并填充**
+找出数组中第一个大于 2 的元素,并用它填充后面的所有位置。
+```cs
+var firstGreaterThanTwo = numbers.First(x => x > 2);
+var filledNumbers = numbers.Select(x => firstGreaterThanTwo).ToArray();
+```
+
+21. **查询并排除**
+从数组中排除所有小于 5 的元素。
+```cs
+var excludedNumbers = numbers.Where(x => x >= 5);
+```
+
+22. **查询并填充默认值**
+如果数组中存在 null 值,用默认值 0 替换。
+```cs
+var replacedNulls = nullableNumbers.Select(x => x ?? 0).ToArray();
+```
+
+23. **查询并转换类型**
+将字符串数组转换为整数数组。
+```cs
+var intNumbers = stringNumbers.Select(int.Parse).ToArray();
+```
+
+24. **查询并使用 OfType 过滤**
+从对象数组中过滤出字符串类型的元素。
+```cs
+var stringElements = objects.OfType().ToList();
+```
+
+
+### 高级练习
+
+25. **合并数组**:使用 `Zip` 合并两个数组,生成新数组。
```cs
var result = numbers1.Zip(numbers2, (x, y) => $"{x} {y}");
```
-2. **生成序列**:创建包含从 1 到 10 的数组。
+26. **生成序列**:创建包含从 1 到 10 的数组。
```cs
var result = Enumerable.Range(1, 10);
```
-3. **重复元素**:将一个元素重复多次,生成新数组。
+27. **重复元素**:将一个元素重复多次,生成新数组。
```cs
var result = Enumerable.Repeat("元素", 10);
```
+28. **查询并使用 Take 限制数量**
+从数组中取出前 5 个元素。
+```cs
+var firstFive = numbers.Take(5);
+```
+
+29. **查询并使用 Skip 跳过元素**
+跳过数组中的前 3 个元素,然后取出剩余的元素。
+```cs
+var remainingElements = numbers.Skip(3);
+```
-4. **过滤特定类型**:从对象数组中过滤出字符串类型的值。
- ```cs
- var result = objects.OfType();
- ```
diff --git "a/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md" "b/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md"
deleted file mode 100644
index 737ecde..0000000
--- "a/\351\231\210\346\200\235\347\235\277/20241204-(\347\274\226\350\276\221,\351\233\206\346\210\220\346\237\245\350\257\242).md"
+++ /dev/null
@@ -1,193 +0,0 @@
-# 实现编辑功能
-
-### 控制器中的实现
-
-#### 1. 获取要编辑的记录
-通过传入的 `Id` 从数据库中查询对应的记录,如果找到则返回用于编辑;否则直接返回列表页。
-```csharp
-public IActionResult Edit(int id)
-{
- // 从数据库中查找目标记录
- var blog = Db.Blogs.FirstOrDefault(b => b.Id == id);
-
- // 将记录传递给视图进行编辑
- return View(blog);
-}
-```
-
-#### 2. 提交编辑后的数据
-通过 POST 请求接收用户修改后的内容,并将其保存到数据库中。
-- 如果输入有效且记录存在,则更新数据并保存。
-- 如果未找到记录,则返回到列表页。
-```csharp
-[HttpPost]
-[ValidateAntiForgeryToken]
-public IActionResult Edit(Blog input)
-{
- var blog = Db.Blogs.FirstOrDefault(b => b.Id == input.Id);
- if (blog != null)
- {
- // 更新记录的字段
- blog.Title = input.Title;
- blog.Content = input.Content;
- blog.Author = input.Author;
- }
-
- // 保存后跳转到首页
- return RedirectToAction("Index");
-}
-```
-
----
-
-### 视图中的实现
-
-编辑界面使用表单提交修改内容,内容结构与新增页面类似:
-```html
-@model Blog.Models.Blog
-
-
-```
-
----
-
-# 集成 LINQ 查询
-
-LINQ 是一种用于操作集合的强大工具,通常用于实现高效的查询和数据处理。
-
-### 查询单个元素
-- **获取首个匹配项**:`First()` 会返回符合条件的第一个元素,如果不存在则抛出异常。
-- **安全获取**:`FirstOrDefault()` 如果未找到匹配项,则返回 `null`。
-```csharp
-var blog = Db.Blogs.FirstOrDefault(b => b.Id == id);
-```
-
-### 查询多个元素
-- **筛选条件**:`Where()` 方法可根据条件返回多个匹配项。
-```csharp
-var blogs = Db.Blogs.Where(b => b.Author == "张三" && b.Id > 10);
-```
-
-### 返回指定字段
-- **映射结果**:使用 `Select()` 返回处理后的字段集合。
-```csharp
-var result = Db.Blogs.Select(b => new { BlogId = b.Id, Writer = b.Author });
-```
-
----
-
-# 综合功能实现示例
-
-## 删除功能
-### 删除视图
-```html
-@model Blog.Models.Blog
-
-
-
- | 标题: |
- @Model.Title |
-
-
- | 内容: |
- @Model.Content |
-
-
- | 作者: |
- @Model.Author |
-
-
- |
- 确认删除
- |
-
- 取消
- |
-
-
-```
-
-### 控制器实现
-```csharp
-public IActionResult ConfirmDelete(int id)
-{
- var blog = Db.Blogs.FirstOrDefault(b => b.Id == id);
- if (blog != null)
- {
- Db.Blogs.Remove(blog);
- }
- return RedirectToAction("Index");
-}
-```
-
----
-
-## 新增功能
-### 新增视图
-```html
-@model Blog.Models.Blog
-
-
-```
-
-### 控制器实现
-```csharp
-public IActionResult Create()
-{
- return View();
-}
-
-[HttpPost]
-public IActionResult Create(Blog input)
-{
- if (ModelState.IsValid)
- {
- input.Id = Db.Blogs.Max(b => b.Id) + 1; // 自动生成新 ID
- Db.Blogs.Add(input);
- return RedirectToAction("Index");
- }
- return View(input);
-}
-```
-
----
-
-## 搜索功能
-### 搜索视图
-```html
-
-
-
-```
-
-### 控制器实现
-```csharp
-public IActionResult Index(string keyword)
-{
- if (string.IsNullOrWhiteSpace(keyword))
- {
- return View(Db.Blogs);
- }
- else
- {
- var results = Db.Blogs.Where(b =>
- b.Title.Contains(keyword) ||
- b.Content.Contains(keyword) ||
- b.Author.Contains(keyword)).ToList();
- return View(results);
- }
-}
\ No newline at end of file
--
Gitee