003.LINQ在WEB API中的应用

LINQ是什么

语言整合查询(全名:Language Integrated Query )

用途

就如全名所代表的意思,各种不同的查询对象,通常都会有各自的语法,但如果每种都要学,就会花很多时间,而且少用的就学的不精,也很容易忘记

因此今天发明了LINQ,只要学习一种LINQ语法,我就可以查询各种不同的对象,大幅减少学习成本与方便性

例如:

  1. LINQ to Objects:使用LINQ 语法查询Object
  2. LINQ to SQL:使用LINQ 语法查询资料库资料
  3. LINQ to XML:使用LINQ 语法查询XML资料

等等还有各种的常见的查询对象,LINQ都有其对应的支援

这可以很有效的解决,今天特定专案刚好要查询一个很冷门的资料类型对象,此时你不用特地去学该对象的查询语法,只需要使用LINQ就可以简单查询

那背后当然是LINQ会帮你转换成对应对象的语法进行查询

你也不会事后过了很久之后要维护,还需要重新复习该冷门资料的查询语法

所以在C#这边LINQ可以说是必学的一项技术

另外这边也建议如果还在用SQL写在程式码中的人,赶快换成LINQ,不仅可以让你的程式更优雅,可以侦错,也可以有效的避免注入攻击(这之后会示范)

当然,在某些例外情况,还是有自己写SQL的必要,不过就通常的查询、新增、修改、删除用LINQ就绰绰有余了

写法

LINQ这边主要有两种不同的写法,但得到的结果是一样的

1.宣告式(Declarative)

学过SQL语法的人,可能会觉得有点像SQL叙述句的感觉,譬如说我今天要查一个新闻标题为"凯哥写程式"的新闻,可以这么写

cs 复制代码
var result = from a in NewsList
             where a.Title == "凱哥寫程式"
             select a;

其实看起来可读性相当的高,就是从NewsList中,找Title为凯哥写程式的那一笔出来

2.编程式(Imperative):(lambda)

cs 复制代码
var result = NewsList.Where(a => a.Title == "凱哥寫程式");

看起来就比较抽象一点,不过这个范例比较简单,所以还算看得清楚,但就观看性而言,变得更简洁

至于要用哪一种,其实就看个人喜好

四.以下就来简单示范一下查询、新增、修改、删除的LINQ怎么写

1.新建一个Models文件夹用于存放数据模型

2.在Models文件下新建数据类News.cs

cs 复制代码
namespace Esp32_Server.Models
{
    public class News
    {
        public int NewsId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }
    }
}

3.新将一个控制器LINQ_TEST用于测试

cs 复制代码
using Microsoft.AspNetCore.Mvc;
using Esp32_Server.Models;

namespace Esp32_Server.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class LINQ_TEST : ControllerBase
    {
        private static readonly List<News> NewsList = new List<News>
        {
            new News{NewsId=1,Title="陈佳鹏",Content="大帅哥"},
            new News{NewsId=2,Title="高小敏",Content="大美女"},
            new News{NewsId=3,Title="刘罗锅",Content="老男人"},
            new News{NewsId=4,Title="小米",Content="天堂车"}
        };

        //IEnumerable<T> 是一个接口,表示一个可枚举的集合。它提供了一个GetEnumerator方法,可以返回一个IEnumerator<T>对象,用于迭代集合中的元素。


        //查詢全部新聞
        [HttpGet]
        public IEnumerable<News> Get()
        {
            return NewsList;
        }

        //查詢指定新聞
        [HttpGet("{id}")]
        public IEnumerable<News> Get(int id)
        {
            var result = from a in NewsList
                         where a.NewsId == id
                         select a;

            result = NewsList.Where(a => a.NewsId == id);

            return result;
        }

        //新增一筆新聞
        [HttpPost]
        public IEnumerable<News> Post(News value)
        {
            NewsList.Add(value);//new了一个数据类对象添加给集合

            return NewsList;
        }

        //修改一筆新聞
        [HttpPut("{id}")]
        public IEnumerable<News> Put(int id, News value)
        {
            var update = (from a in NewsList
                          where a.NewsId == id
                          select a).SingleOrDefault();

            update = NewsList.SingleOrDefault(a => a.NewsId == id);

            if (update != null)
            {
                update.Title = value.Title;
                update.Content = value.Content;
            }

            return NewsList;
        }

        //刪除一筆新聞
        [HttpDelete("{id}")]
        public IEnumerable<News> Delete(int id)
        {
            var delete = (from a in NewsList
                          where a.NewsId == id
                          select a).SingleOrDefault();

            delete = NewsList.SingleOrDefault(a => a.NewsId == id);

            if (delete != null)
            {
                NewsList.Remove(delete);
            }

            return NewsList;
        }
    }
}

4.增删改查示例

4.1.get所有

4.2 GET指定id

4.3. POST 注册增加一条数据

4.4 PUT 修改一条数据

4.5 Delete 删除一条数据

相关推荐
中云DDoS CC防护蔡蔡19 分钟前
DDOS和CC攻击谁更可怕
运维·服务器·经验分享·网络安全·ddos
Ruiery27 分钟前
Linux 6.6内核内存管理深度解析(十六):mmap — 用户态“申请内存“的真相
linux·运维·服务器
欧米欧1 小时前
Linux系统篇(七),环境变量的底层溯源,核心获取机制与安全应用
linux·运维·服务器
Ruiery1 小时前
Linux 6.6内核内存管理深度解析(十八):KASLR 内核地址空间随机化
linux·运维·服务器·安全
前端精髓2 小时前
调用大模型API
运维·服务器·microsoft
逆风的蚂蚁3 小时前
linux服务器性能调整怎么落地?我把 CPU 调度、I/O 优先级和内核参数这几个旋钮都拧了一遍
linux·运维·服务器
ESDWAN4 小时前
企业网络监控应该监测哪些目标?网关、网络节点还是业务系统?
服务器·网络·php
发光小北5 小时前
EtherNet/IP 转 ModbusTCP 网关现场应用中会遇到什么问题?
服务器·网络·tcp/ip
程序猿老A6 小时前
轻量云服务器总是卡,内存占比高?
运维·服务器
沫璃染墨7 小时前
从零入门计算机网络系列(十一):HTTP协议进阶——从重定向原理到GET/POST与Fiddler抓包
linux·服务器·开发语言·网络·c++·tcp/ip·html