.NET Core MongoDB的简单使用

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: .NET Core MongoDB的简单使用

一、创建测试库、测试表、添加测试数据

使用之前文章提到的MongoDB Compass用法分别添加数据库[myDb]和集合(表)[userinfos]信息,

参考链接为:MongoDB Compass的安装及使用图文说明(非常详细),同时数据库连接语句也可从MongoDB Compass中获得

image.gif

使用mongo shell命令添加测试数据

image.gif

添加完成,MongoDB Compass中可看到已添加的数据

image.gif

二、新建ASP.NET Core Web API项目

1、使用NuGet包管理器添加MongoDB.Driver

image.gif

2、编写demo示例

1)插入

向myDb.userinfos中插入一条数据

/// <summary>
/// 插入数据demo(仅可执行一次)
/// </summary>
[HttpGet, HttpPost]
public void InsertDemo()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument>("userinfos");
    // 待添加的document
    // 待添加的document
    var doc = new BsonDocument {
        { "_id", 7 },
        { "name", "吴九" },
        { "age", 29 },
        { "ename", new BsonDocument
            {
                { "firstname", "jiu" },
                { "lastname", "wu" }
            }
        }
    };
    // InsertOne() 添加单条document
    mycollection.InsertOne(doc);
    // 添加多条document
    //mycollection.InsertMany(IEnumerable<BsonDocument> docs);
}

image.gif

在MongoDB compass中可以看到新增的数据

image.gif

2)查询

①  简单查询

/// <summary>
/// 简单查询(Find)
/// </summary>
[HttpGet, HttpPost]
public void SearchByFindOrFilter()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument>("userinfos");
    // Filter用于过滤,如查询name = '吴九' 的第一条记录
    var filter = Builders<BsonDocument>.Filter;
    // Find(Filter)进行查询
    var doc = mycollection.Find(filter.Eq("name", "吴九")).FirstOrDefault();
    Console.WriteLine("简单查询结果:" + doc);
}

image.gif

简单查询结果为:

image.gif ②  AND查询

/// <summary>
/// AND查询
/// </summary>
[HttpGet, HttpPost]
public void SearchByAnd()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument>("userinfos");
    // 查询年龄大于25且小于28的记录
    var filter = Builders<BsonDocument>.Filter;
    var docs = mycollection.Find(filter.Gt("age", 25) & filter.Lt("age", 28)).ToList();
    Console.WriteLine("AND查询结果:" + d)
    docs.ForEach(d => Console.WriteLine(d));
}

image.gif

AND查询结果为:

image.gif

③  OR查询

/// <summary>
/// OR查询
/// </summary>
[HttpGet, HttpPost]
public void SearchByOr()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument>("userinfos");
    // 查询年龄小于25或大于28的记录
    var filter = Builders<BsonDocument>.Filter;
    var docs = mycollection.Find(filter.Lt("age", 25) | filter.Gt("age", 28)).ToList();
    Console.WriteLine("OR查询结果为:");
    docs.ForEach(d => Console.WriteLine(d));
}

image.gif

OR查询结果为:

image.gif ④  字段存在(Exists)

/// <summary>
/// 字段存在(Exists)
/// </summary>
[HttpGet, HttpPost]
public void SearchIsExists()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument>("userinfos");
    // 查询存在address字段的记录
    var filter = Builders< BsonDocument>.Filter;
    var docs = mycollection.Find(filter.Exists("address")).ToList();
    Console.WriteLine("存在address记录的查询结果为:");
    docs.ForEach(d => Console.WriteLine(d));
}

image.gif

字段存在(Exists)的查询结果为:

image.gif

⑤  排序(Sort)

/// <summary>
/// 排序(Sort)
/// </summary>
[HttpGet, HttpPost]
public void SearchWithSort()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument>("userinfos");
    // 查询age<26的记录,按年龄倒序排列
    var filter = Builders <BsonDocument>.Filter;
    var sort = Builders <BsonDocument>.Sort;
    var docs = mycollection.Find(filter.Lt("age", 26)) // 过滤
        .Sort(sort.Descending("age")) // 排序
        .ToList();
    Console.WriteLine("排序的查询结果为:");
    docs.ForEach(d => Console.WriteLine(d));
}

image.gif

排序(Sort)的查询结果为:

image.gif

⑥  查询指定字段(Projection)

/// <summary>
/// 查询指定字段(Projection)
/// </summary>
[HttpGet, HttpPost]
public void SearchWithSpecifyField()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument>("userinfos");
    // 查询age<26的记录,包含name、age,排除 _id
    var filter = Builders<BsonDocument>.Filter;
    var project = Builders<BsonDocument>.Projection;
    var docs = mycollection.Find(filter.Lt("age", 26)) // 过滤
        .Project(project.Include("name") // 包含name
            .Include("age") // 包含age
            .Exclude("_id")) // 包含_id
        .ToList();
    Console.WriteLine("查询指定字段的查询结果为:");
    docs.ForEach(d => Console.WriteLine(d));
}

image.gif

查询指定字段(Projection)的查询结果为:

image.gif3)修改

①  修改单条记录(UpdateOne)

/// <summary>
/// 修改单条记录(UpdateOne)
/// </summary>
[HttpGet, HttpPost]
public void UpdateOneRecord()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument > ("userinfos");
    var filter = Builders<BsonDocument>.Filter;
    var update = Builders<BsonDocument>.Update;
    var project = Builders<BsonDocument>.Projection;
    var docBefore = mycollection.Find(filter.Eq("name", "张三")).Project(project.Include("age").Include("name")).FirstOrDefault();
    Console.WriteLine("修改前单条记录的结果为:" + docBefore);
    // 将张三的年龄改为18
    mycollection.UpdateOne(filter.Eq("name", "张三"), update.Set("age", 18));
    // 查询修改后张三的记录
    var docAfter = mycollection.Find(filter.Eq("name", "张三")).Project(project.Include("age").Include("name")).FirstOrDefault();
    Console.WriteLine("修改后单条记录的结果为:" + docAfter);
}

image.gif

修改单条记录的结果如下:

image.gif

②  修改多条记录(UpdateMany)

/// <summary>
/// 修改多条记录(UpdateMany)
/// </summary>
[HttpGet, HttpPost]
public void UpdateManyRecord()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument>("userinfos");
    var filter = Builders<BsonDocument>.Filter;
    var update = Builders<BsonDocument>.Update;
    var project = Builders<BsonDocument>.Projection;
    var docBefore = mycollection.Find(filter.Empty).Project(project.Include("age").Include("name").Include("mark")) // 没有的列不会显示
        .ToList();
    Console.WriteLine("修改多条记录前的结果为:");
    docBefore.ForEach(d => Console.WriteLine(d));
    // 将所有年龄小于25的记录标记为young(如果没有mark字段会自动添加)
    UpdateResult result = mycollection.UpdateMany(filter.Lt("age", 25), update.Set("mark", "young"));
    if(result.IsModifiedCountAvailable) // 获取一个表示修改后的计数是否可用的值
    {
        Console.WriteLine($ "符合条件的有{result.MatchedCount}条记录,");
        Console.WriteLine($ "一共修改了{result.ModifiedCount}条记录。");
        // 查询修改后的记录
        var docs = mycollection.Find(filter.Empty).Project(project.Include("age").Include("name").Include("mark")).ToList();
        Console.WriteLine("修改多条记录后的结果为:");
        docs.ForEach(d => Console.WriteLine(d));
    }
    else
    {
        Console.WriteLine("无修改操作!");
    }
}

image.gif

修改多条记录(UpdateMany)的结果为:

image.gif

4)删除

①  删除单条记录(DeleteOne)

/// <summary>
/// 删除单条记录(DeleteOne)
/// </summary>
[HttpGet, HttpPost]
public void DeleteOneRecord()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument> ("userinfos");
    var filter = Builders<BsonDocument>.Filter;
    var project = Builders<BsonDocument>.Projection;
    var docBefore = mycollection.Find(filter.Empty).Project(project.Include("age").Include("name").Include("mark")).ToList();
    Console.WriteLine("删除张三前的记录的结果为:");
    docBefore.ForEach(d => Console.WriteLine(d));
    // 删除名字为张三的记录
    mycollection.DeleteOne(filter.Eq("name", "张三"));
    // 查询删除张三后的记录
    var docs = mycollection.Find(filter.Empty).Project(project.Include("age").Include("name").Include("max")).ToList();
    Console.WriteLine("删除张三后的记录的结果为:");
    docs.ForEach(d => Console.WriteLine(d));
}

image.gif

删除单条记录(DeleteOne)的结果为:

image.gif

②  删除多条记录(DeleteMany)

/// <summary>
/// 删除多条记录(DeleteMany)
/// </summary>
[HttpGet, HttpPost]
public void DeleteManyRecord()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<BsonDocument> ("userinfos");
    var filter = Builders<BsonDocument>.Filter;
    var project = Builders<BsonDocument>.Projection;
    var docBefore = mycollection.Find(filter.Empty).Project(project.Include("age").Include("name").Include("mark")).ToList();
    Console.WriteLine("删除所有年龄大于25岁的记录前的结果为:");
    docBefore.ForEach(d => Console.WriteLine(d));
    // 删除所有年龄大于25岁的记录
    DeleteResult result = mycollection.DeleteMany(filter.Gt("age", 25));
    Console.WriteLine($ "一共删除了{result.DeletedCount}条记录");
    // 查询删除所有年龄大于25岁的记录
    var docs = mycollection.Find(filter.Empty).Project(project.Include("age").Include("name").Include("max")).ToList();
    Console.WriteLine("删除所有年龄大于25岁的记录后的结果为:");
    docs.ForEach(d => Console.WriteLine(d));
}

image.gif

删除多条记录(DeleteMany)的结果为:

image.gif

5)类型映射

①  查询结果映射到实体类示例

mongoDB支持自动映射,直接使用泛型即可

/// <summary>
/// 查询结果映射到实体类示例
/// </summary>
[HttpGet, HttpPost]
public void TypeMappingDemo()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<Userinfo>("userinfos");
    var filter = Builders<Userinfo>.Filter;
    var sort = Builders<Userinfo>.Sort;
    List<Userinfo> userinfos = mycollection.Find(filter.Lte("age", 25)) // 查询年龄小于等于25岁的记录
        .Sort(sort.Descending("age")) // 按年龄进行倒序
        .ToList();
    // 遍历结果
    userinfos.ForEach(u => Console.WriteLine($ "姓名:{u.name},年龄:{u.age},英文名:{u.ename.firstname} {u.ename.lastname}"));
    Console.ReadKey();
}

image.gif

用户信息类

/// <summary>
/// 用户信息类
/// </summary>
public class Userinfo
{
    /// <summary>
    /// id
    /// </summary>
    public int _id { get; set; }
    /// <summary>
    /// 姓名
    /// </summary>
    public string name { get; set; }
    /// <summary>
    /// 年龄
    /// </summary>
    public int age { get; set; }
    /// <summary>
    /// 等级
    /// </summary>
    public int level { get; set; }
    /// <summary>
    /// 英文名
    /// </summary>
    public Ename ename { get; set; }
    /// <summary>
    /// 角色
    /// </summary>
    public string[] roles { get; set; }
    /// <summary>
    /// 地址
    /// </summary>
    public string address { get; set; }
    /// <summary>
    /// 标记
    /// </summary>
    public string mark { get; set; }
}

image.gif

英文名类

/// <summary>
/// 英文名
/// </summary>
public class Ename
{
    /// <summary>
    /// 名
    /// </summary>
    public string firstname { get; set; }
    /// <summary>
    /// 姓
    /// </summary>
    public string lastname { get; set; }
}

image.gif

查询结果映射到实体类示例的结果为:

image.gif

②  查询结果映射到实体类示例 - 常用属性修改上方代码

上边的例子仅仅用了基本的自动化映射,使用基本的自动化映射时:类和Bson中的字段必须严格一致(_id除外,可以自动映射到_id/id/Id),且Bson中的每一个字段在实体类中都必须有一个对应的字段,不然就会抛出异常,这就造成我们可能要写一个非常庞大的实体类,而且类中的字段命名也要严格和Bson中的字段一致。这些限制对我们开发来说是不能接受的,这里我们采用mongoDriver中的一些属性改进一下上边的代码,如下:

/// <summary>
/// 查询结果映射到实体类示例 - 常用属性修改上方代码
/// </summary>
[HttpGet, HttpPost]
public void TypeMappingWithCommonAttributes()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var mycollection = mydb.GetCollection<UserinfoBson>("userinfos");
    var filter = Builders<UserinfoBson>.Filter;
    var sort = Builders<UserinfoBson>.Sort;
    List<UserinfoBson> userinfos = mycollection.Find(filter.Lte("age", 25)) // 查询年龄小于等于25岁的记录
        .Sort(sort.Descending("age")) // 按年龄进行倒序
        .ToList();
    // 遍历结果
    userinfos.ForEach(u =>
    {
        Console.WriteLine($ "编号:{u.userId},姓名:{u.name},年龄:{u.age},英文名:{u.ename?.ming} {u.ename.xing},性别:{u.gender}");
        Console.WriteLine($ "其他属性:{u.otherprops}");
        Console.WriteLine();
    });
    Console.ReadKey();
}

image.gif

用户信息类 - Bson

/// <summary>
/// 用户信息类 - Bson
/// </summary>
public class UserinfoBson
{
    /// <summary>
    /// id
    /// </summary>
    [BsonId] // BsonId修饰的字段对应BsonDocument中的_id;
    public int userId { get; set; }
    /// <summary>
    /// 姓名
    /// </summary>
    public string name { get; set; }
    /// <summary>
    /// 年龄
    /// </summary>
    public int age { get; set; }
    /// <summary>
    /// 英文名
    /// </summary>
    public EnameBson ename { get; set; }
    /// <summary>
    /// 性别
    /// </summary>
    [BsonDefaultValue('男')] // BsonDefaultValue(value)用于指定默认值;
    public char gender { get; set; }
    /// <summary>
    /// 昵称
    /// </summary>
    [BsonIgnore] // BsonIgnore表示不映射,即使BsonDocument中包含该字段也不会赋值给属性;
    public string nickname { get; set; }
    /// <summary>
    /// 其他属性
    /// </summary>
    [BsonExtraElements] // BsonExtraElements修饰的字段用于存储没有映射到类中的其他属性;
    public BsonDocument otherprops { get; set; }
}

image.gif

英文名类 - Bson

/// <summary>
/// 英文名 - Bson
/// </summary>
public class EnameBson
{
    /// <summary>
    /// 名
    /// </summary>
    [BsonElement("firstname")] // BsonElement可以指定修饰的属性映射到BsonDocument中的哪个字段
    public string ming { get; set; }
    /// <summary>
    /// 姓
    /// </summary>
    [BsonElement("lastname")]
    public string xing { get; set; }
}

image.gif

查询结果映射到实体类示例 - 常用属性修改上方代码的结果为:

image.gif

6)使用LINQ查询

①  基本查询:查找年龄大于22岁的学生;②  连接查询:查询各个学生的学号、姓名、班级名

/// <summary>
/// 使用LINQ查询
/// </summary>
[HttpGet, HttpPost]
public void LINQQuery()
{
    // 连接数据库
    var client = new MongoClient("mongodb://localhost:27017/?readPreference=primary&appname=MongoDB%20Compass&ssl=false");
    // 获取DataBase
    var mydb = client.GetDatabase("myDb");
    // 获取Collection
    var stuCollection = mydb.GetCollection<Student> ("students");
    var clsCollection = mydb.GetCollection <Classx> ("classes");
    //查找年龄大于22的学生
    Console.WriteLine("-------------查找年龄大于22的学生列表--------------");
    //1.query语法
    List<Student> stuList1 = (from stu in stuCollection.AsQueryable() where stu.age > 22 select stu).ToList();
    //2.点语法
    List<Student> stuList2 = stuCollection.AsQueryable().Where(s => s.age > 22).ToList();
    stuList1.ForEach(stu => Console.WriteLine($ "姓名:{stu?.stuName},  年龄:{stu?.age}"));
    Console.WriteLine();
    //表连接查询,查询各个学生的班级名
    Console.WriteLine("-------------表连接,查询学生的班级名----------------");
    //1.query语法
    var result1 = from stu in stuCollection.AsQueryable()
    join cls in clsCollection.AsQueryable()
    on stu.classNo equals cls.no
    select new
    {
        stuno = stu.no, stu.stuName, cls.clsName
    };
    //2.点语法
    var result2 = stuCollection.AsQueryable().Join(clsCollection.AsQueryable(), stu => stu.classNo, cls => cls.no, (stu, cls) => new
    {
        stuno = stu.no, stu.stuName, cls.clsName
    });
    //遍历结果
    foreach(var item in result1)
    {
        Console.WriteLine($ "学号:{item.stuno}, 姓名:{item.stuName}, 班级:{item.clsName}");
    }
    Console.ReadKey();
}

image.gif

学生类

/// <summary>
/// 学生类
/// </summary>
public class Student
{
    /// <summary>
    /// 学号
    /// </summary>
    public int no
    { get; set; }
    /// <summary>
    /// 姓名
    /// </summary>
    public string stuName
    { get; set; }
    /// <summary>
    /// 年龄
    /// </summary>
    public int age { get; set; }
    /// <summary>
    /// 班级编号
    /// </summary>
    public int classNo { get; set; }
    /// <summary>
    /// 其他
    /// </summary>
    [BsonExtraElements]
    public BsonDocument others { get; set; }
}

image.gif

班级类

/// <summary>
/// 班级类
/// </summary>
public class Classx
{
    /// <summary>
    /// 班级编号
    /// </summary>
    public int no { get; set; }
    /// <summary>
    /// 班级名
    /// </summary>
    public string clsName { get; set; }
    /// <summary>
    /// 其他
    /// </summary>
    [BsonExtraElements]
    public BsonDocument others { get; set; }
}

image.gif

查找年龄大于22岁的学生以及查询各个学生的学号、姓名、班级名的结果如下:

image.gif

三、附录

1、userinfos表测试数据

use myDb
db.userinfos.insertMany([
   {_id:1, name: "张三", age: 23,level:10, ename: { firstname: "san", lastname: "zhang"}, roles: ["vip","gen" ]},
   {_id:2, name: "李四", age: 24,level:20, ename: { firstname: "si", lastname: "li"}, roles:[ "vip" ]},
   {_id:3, name: "王五", age: 25,level:30, ename: { firstname: "wu", lastname: "wang"}, roles: ["gen","vip" ]},
   {_id:4, name: "赵六", age: 26,level:40, ename: { firstname: "liu", lastname: "zhao"}, roles: ["gen"] },
   {_id:5, name: "田七", age: 27, ename: { firstname: "qi", lastname: "tian"}, address:'北京' },
   {_id:6, name: "周八", age: 28,roles:["gen"], address:'上海' }
])

image.gif

2、student表测试数据

db.students.insertMany([
    {"no":1, "stuName":"jack", "age":23, "classNo":1},
    {"no":2, "stuName":"tom", "age":20, "classNo":2},
    {"no":3, "stuName":"hanmeimei", "age":22, "classNo":1},
    {"no":4, "stuName":"lilei", "age":24, "classNo":2}
    ])

image.gif

3、classs表测试数据

db.classes.insertMany([
    {"no" : 1,"clsName" : "A班"},
    {"no" : 2,"clsName" : "B班"}
    ])

image.gif

4、 MongoDB .NET Driver官方文档:http://mongodb.github.io/mongo-csharp-driver/

以上就是.NET Core MongoDB的简单使用的介绍,做此记录,如有帮助,欢迎点赞关注收藏!

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
1月前
|
存储 开发框架 JSON
ASP.NET Core OData 9 正式发布
【10月更文挑战第8天】Microsoft 在 2024 年 8 月 30 日宣布推出 ASP.NET Core OData 9,此版本与 .NET 8 的 OData 库保持一致,改进了数据编码以符合 OData 规范,并放弃了对旧版 .NET Framework 的支持,仅支持 .NET 8 及更高版本。新版本引入了更快的 JSON 编写器 `System.Text.UTF8JsonWriter`,优化了内存使用和序列化速度。
|
2月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
2月前
|
开发框架 .NET 中间件
ASP.NET Core Web 开发浅谈
本文介绍ASP.NET Core,一个轻量级、开源的跨平台框架,专为构建高性能Web应用设计。通过简单步骤,你将学会创建首个Web应用。文章还深入探讨了路由配置、依赖注入及安全性配置等常见问题,并提供了实用示例代码以助于理解与避免错误,帮助开发者更好地掌握ASP.NET Core的核心概念。
87 3
|
24天前
|
开发框架 JavaScript 前端开发
一个适用于 ASP.NET Core 的轻量级插件框架
一个适用于 ASP.NET Core 的轻量级插件框架
|
2月前
|
开发框架 NoSQL .NET
利用分布式锁在ASP.NET Core中实现防抖
【9月更文挑战第5天】在 ASP.NET Core 中,可通过分布式锁实现防抖功能,仅处理连续相同请求中的首个请求,其余请求返回 204 No Content,直至锁释放。具体步骤包括:安装分布式锁库如 `StackExchange.Redis`;创建分布式锁服务接口及其实现;构建防抖中间件;并在 `Startup.cs` 中注册相关服务和中间件。这一机制有效避免了短时间内重复操作的问题。
|
3月前
|
Java 前端开发 Spring
技术融合新潮流!Vaadin携手Spring Boot、React、Angular,引领Web开发变革,你准备好了吗?
【8月更文挑战第31天】本文探讨了Vaadin与Spring Boot、React及Angular等主流技术栈的最佳融合实践。Vaadin作为现代Java Web框架,与其他技术栈结合能更好地满足复杂应用需求。文中通过示例代码展示了如何在Spring Boot项目中集成Vaadin,以及如何在Vaadin项目中使用React和Angular组件,充分发挥各技术栈的优势,提升开发效率和用户体验。开发者可根据具体需求选择合适的技术组合。
65 0
|
3月前
|
开发框架 监控 .NET
开发者的革新利器:ASP.NET Core实战指南,构建未来Web应用的高效之道
【8月更文挑战第28天】本文探讨了如何利用ASP.NET Core构建高效、可扩展的Web应用。ASP.NET Core是一个开源、跨平台的框架,具有依赖注入、配置管理等特性。文章详细介绍了项目结构规划、依赖注入配置、中间件使用及性能优化方法,并讨论了安全性、可扩展性以及容器化的重要性。通过这些技术要点,开发者能够快速构建出符合现代Web应用需求的应用程序。
51 0
|
3月前
|
缓存 数据库连接 API
Entity Framework Core——.NET 领域的 ORM 利器,深度剖析其最佳实践之路
【8月更文挑战第28天】在软件开发领域,高效的数据访问与管理至关重要。Entity Framework Core(EF Core)作为一款强大的对象关系映射(ORM)工具,在 .NET 开发中扮演着重要角色。本文通过在线书店应用案例,展示了 EF Core 的核心特性和优势。我们定义了 `Book` 实体类及其属性,并通过 `BookStoreContext` 数据库上下文配置了数据库连接。EF Core 提供了简洁的 API,支持数据的查询、插入、更新和删除操作。
110 0
|
开发框架 前端开发 .NET
ASP.NET Core 核心特性学习笔记「下」
ASP.NET Core 核心特性学习笔记「下」
|
开发框架 前端开发 中间件
ASP.NET Core 核心特性学习笔记「上」
ASP.NET Core 核心特性学习笔记「上」