.NET Core MongoDB的简单使用

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: .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月前
|
消息中间件 前端开发 小程序
一个基于.NET Core构建的简单、跨平台、模块化的商城系统
今天大姚给大家分享一个基于.NET Core构建的简单、跨平台、模块化、完全开源免费(MIT License)的商城系统:Module Shop。
|
1月前
|
算法 C# 数据库
【干货】一份10万字免费的C#/.NET/.NET Core面试宝典
C#/.NET/.NET Core相关技术常见面试题汇总,不仅仅为了面试而学习,更多的是查漏补缺、扩充知识面和大家共同学习进步。该知识库主要由自己平时学习实践总结、网上优秀文章资料收集(这一部分会标注来源)和社区小伙伴提供三部分组成。该份基础面试宝典完全免费,发布两年来收获了广大.NET小伙伴的好评,我会持续更新和改进,欢迎关注我的公众号【追逐时光者】第一时间获取最新更新的面试题内容。
|
1月前
|
数据可视化 网络协议 C#
C#/.NET/.NET Core优秀项目和框架2024年3月简报
公众号每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),公众号推文中有项目和框架的介绍、功能特点、使用方式以及部分功能截图等(打不开或者打开GitHub很慢的同学可以优先查看公众号推文,文末一定会附带项目和框架源码地址)。注意:排名不分先后,都是十分优秀的开源项目和框架,每周定期更新分享(欢迎关注公众号:追逐时光者,第一时间获取每周精选分享资讯🔔)。
|
4月前
|
开发框架 前端开发 JavaScript
盘点72个ASP.NET Core源码Net爱好者不容错过
盘点72个ASP.NET Core源码Net爱好者不容错过
75 0
|
2月前
|
存储 NoSQL Unix
.NET生成MongoDB中的主键ObjectId
.NET生成MongoDB中的主键ObjectId
.NET生成MongoDB中的主键ObjectId
|
15天前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
22 0
|
1月前
|
Linux API iOS开发
.net core 优势
.NET Core 的优势:跨平台兼容(Windows, macOS, Linux)及容器支持,高性能,支持并行版本控制,丰富的新增API,以及开源。
26 4
|
1月前
|
开发框架 人工智能 .NET
C#/.NET/.NET Core拾遗补漏合集(持续更新)
在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NET Core拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。
|
2月前
|
开发框架 中间件 .NET
C# .NET面试系列七:ASP.NET Core
## 第一部分:ASP.NET Core #### 1. 如何在 controller 中注入 service? 在.NET中,在ASP.NET Core应用程序中的Controller中注入服务通常使用<u>依赖注入(Dependency Injection)</u>来实现。以下是一些步骤,说明如何在Controller中注入服务: 1、创建服务 首先,确保你已经在应用程序中注册了服务。这通常在Startup.cs文件的ConfigureServices方法中完成。例如: ```c# services.AddScoped<IMyService, MyService>(); //
78 0
|
3月前
|
开发框架 前端开发 .NET
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!
为了便于大家查找,特将之前开发的.Net Core相关的五大案例整理成文,共计440页,32w字,免费提供给大家,文章底部有PDF下载链接。
39 1
福利来袭,.NET Core开发5大案例,30w字PDF文档大放送!!!