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 0000000000000000000000000000000000000000..13031e061c6fa31836bac45dbf4e350a8e5e5abc --- /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 0000000000000000000000000000000000000000..737ecde25b3ad6ff6ce13014ec72fa83a76cd252 --- /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