前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >在.NET Core中使用MongoDB明细教程(3):Skip, Sort, Limit, Projections

在.NET Core中使用MongoDB明细教程(3):Skip, Sort, Limit, Projections

作者头像
依乐祝
发布于 2020-08-20 08:07:35
发布于 2020-08-20 08:07:35
85400
代码可运行
举报
文章被收录于专栏:依乐祝依乐祝
运行总次数:0
代码可运行

到目前为止,我们已经讨论了创建文档, 检索文档,现在让我们来研究一下文档排序,指定要跳过或限制返回的文档数量,以及如何进行投影。此篇文章中的实例代码摘录自原文,未像前几篇文章一样进行实际代码的验证。

作者:依乐祝 译文地址:https://cloud.tencent.com/developer/article/1683485 英文地址:https://www.codementor.io/@pmbanugo/working-with-mongodb-in-net-part-3-skip-sort-limit-and-projections-oqfwncyka

Limit

当我们查询一个文档时,我们有时不想返回所有符合过滤条件的文档,而只返回其中的一部分。这就是limit 方法的具体应用。对于MongoDB,可以通过调用Find返回的IFindFluentlimit方法来限制文档的数量。因此,如果我查询数据库中年龄小于40岁的学生,我会得到以下信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
S/N: 1 	 Id: 582489339798f091295b9094, FirstName: Gregor, LastName: Felix
S/N: 2 	 Id: 582489339798f091295b9095, FirstName: Machiko, LastName: Elkberg
S/N: 3 	 Id: 582489339798f091295b9096, FirstName: Julie, LastName: Sandal
S/N: 4 	 Id: 583da304f03a84d4d4f4678d, FirstName: Peter, LastName: Cyborg

为了让它把结果限制在最多两个学生,我调用了Limit()方法,并传递值为2的参数:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int count = 1;
await collection.Find(x => x.Age < 40)
    .Limit(2)
    .ForEachAsync(
        student =>
        {
            Console.WriteLine($"S/N: {count} \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}");
            count++;
        });

然后得到以下输出,它只返回两个文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
S/N: 1, 	 Id: 582489339798f091295b9094, FirstName: Gregor, LastName: Felix
S/N: 2, 	 Id: 582489339798f091295b9095, FirstName: Machiko, LastName: Elkberg

Skip

如果我们想告诉数据库要跳过多少文档,我们使用fluent接口中的skip方法。因此,它类似于我们之前使用的代码,但是告诉数据库返回年龄小于40的所有代码,并跳过第一个。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int count = 1;
await collection.Find(x => x.Age < 40)
    .Skip(1)
    .ForEachAsync(
        student =>
        {
            Console.WriteLine($"S/N: {count} \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}");
            count++;
        });
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
S/N: 1, 	 Id: 582489339798f091295b9095, FirstName: Machiko, LastName: Elkberg
S/N: 2, 	 Id: 582489339798f091295b9096, FirstName: Julie, LastName: Sandal
S/N: 3, 	 Id: 583da304f03a84d4d4f4678d, FirstName: Peter, LastName: Cyborg

你会注意到Gregor Felix 被跳过了。使用skipsort,我们可以将分页添加到应用程序中。

假设我们要检索集合中的每个学生,一个页面上最多显示两个学生。我们可以通过如下过程实现:

  • 跟踪当前页面和要检索的最大文档数。
  • 确定总页数。
  • 然后检索文档,同时相应地应用skiplimit

我们可以使用以下代码来完成此操作,并将每个页面的结果打印到控制台:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var client = new MongoClient();

var db = client.GetDatabase("schoool");

var collection = db.GetCollection<Student>("students");

int currentPage = 1, pageSize = 2;

double totalDocuments = await collection.CountAsync(FilterDefinition<Student>.Empty);
var totalPages = Math.Ceiling(totalDocuments / pageSize);

for (int i = 1; i <= totalPages; i++)
{
    Console.WriteLine($"Page {currentPage}");
    Console.WriteLine();

    int count = 1;
    await collection.Find(FilterDefinition<Student>.Empty)
        .Skip((currentPage - 1) * pageSize)
        .Limit(pageSize)
        .ForEachAsync(
            student =>
            {
                Console.WriteLine($"S/N: {count}, \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}");
                count++;
            });

    Console.WriteLine();
    currentPage++;
}

我们在控制台窗口中得到以下结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Page 1

S/N: 1, 	 Id: 58469c732adc9f5370e50c9c, FirstName: Gregor, LastName: Felix
S/N: 2, 	 Id: 58469c732adc9f5370e50c9d, FirstName: Machiko, LastName: Elkberg

Page 2

S/N: 1, 	 Id: 58469c732adc9f5370e50c9e, FirstName: Julie, LastName: Sandal
S/N: 2, 	 Id: 58469c732adc9f5370e50c9f, FirstName: Peter, LastName: Cyborg

Page 3

S/N: 1, 	 Id: 58469c732adc9f5370e50ca0, FirstName: James, LastName: Cyborg

这样,我们得到三个页面,因为我们总共有五个记录,每页最多检索两个文档。

Sort

fluent接口的Sort方法采用SortDefinition作为参数,它可以从stringBsonDocument隐式转换,就像FilterDefinition一样。因此,如果我们想使用字符串作为排序定义,按姓氏升序排序,那么它将是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
await collection.Find(FilterDefinition<Student>.Empty)
    .Skip((currentPage - 1) * pageSize)
    .Limit(pageSize)
    .Sort("{LastName: 1}")
    .ForEachAsync(
        student =>
        {
            Console.WriteLine($"S/N: {count}, \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}, Age: {student.Age}");
            count++;
        });

在字符串中,我们有{LastName:1},其中1告诉它升序排序,而-1告诉它按降序排序。如果我们使用前面更新的代码运行应用程序,它会在第一页返回James和Peter作为结果,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Page 1

S/N: 1, 	 Id: 58469c732adc9f5370e50ca0, FirstName: James, LastName: Cyborg, Age: 39
S/N: 2, 	 Id: 58469c732adc9f5370e50c9f, FirstName: Peter, LastName: Cyborg, Age: 39

Page 2

S/N: 1, 	 Id: 58469c732adc9f5370e50c9d, FirstName: Machiko, LastName: Elkberg, Age: 23
S/N: 2, 	 Id: 58469c732adc9f5370e50c9c, FirstName: Gregor, LastName: Felix, Age: 23

Page 3

S/N: 1, 	 Id: 58469c732adc9f5370e50c9e, FirstName: Julie, LastName: Sandal, Age: 25

如果我们希望使用BsonDocument将姓氏按降序排列,则这将是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
await collection.Find(FilterDefinition<Student>.Empty)
    .Skip((currentPage - 1) * pageSize)
    .Limit(pageSize)
    .Sort(new BsonDocument("LastName", -1))
    .ForEachAsync(
        student =>
        {
            Console.WriteLine($"S/N: {count}, \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}, Age: {student.Age}");
            count++;
        });

给出了与之前结果相反的结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Page 1

S/N: 1, 	 Id: 58469c732adc9f5370e50c9e, FirstName: Julie, LastName: Sandal, Age: 25
S/N: 2, 	 Id: 58469c732adc9f5370e50c9c, FirstName: Gregor, LastName: Felix, Age: 23

Page 2

S/N: 1, 	 Id: 58469c732adc9f5370e50c9d, FirstName: Machiko, LastName: Elkberg, Age: 23
S/N: 2, 	 Id: 58469c732adc9f5370e50ca0, FirstName: James, LastName: Cyborg, Age: 39

Page 3

S/N: 1, 	 Id: 58469c732adc9f5370e50c9f, FirstName: Peter, LastName: Cyborg, Age: 39

我们也可以使用SortDefinitionBuilder。因此,我们可以使用构建器帮助方法更新代码以创建一个排序定义,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
await collection.Find(FilterDefinition<Student>.Empty)
    .Skip((currentPage - 1) * pageSize)
    .Limit(pageSize)
    .Sort(Builders<Student>.Sort.Descending("LastName"))
    .ForEachAsync(
        student =>
        {
            Console.WriteLine($"S/N: {count}, \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}, Age: {student.Age}");
            count++;
        });

我们仍然可以得到相同的结果,我们还可以组合不同字段上的升序和降序列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
await collection.Find(FilterDefinition<Student>.Empty)
    .Skip((currentPage - 1) * pageSize)
    .Limit(pageSize)
    .Sort(Builders<Student>.Sort.Descending("LastName").Ascending("FirstName"))
    .ForEachAsync(
        student =>
        {
            Console.WriteLine($"S/N: {count}, \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}, Age: {student.Age}");
            count++;
        });

或使用强类型对象时,使用表达式树:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
await collection.Find(FilterDefinition<Student>.Empty)
    .Skip((currentPage - 1) * pageSize)
    .Limit(pageSize)
    .Sort(Builders<Student>.Sort.Descending(x => x.LastName).Ascending(x => x.FirstName))
    .ForEachAsync(
        student =>
        {
            Console.WriteLine($"S/N: {count}, \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}, Age: {student.Age}");
            count++;
        });

我们还可以使用表达式树来指定对SortBy, SortByDescending, ThenByThenByDescendingFLUENT接口的方法。按照前面的示例,这将被定义为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
await collection.Find(FilterDefinition<Student>.Empty)
    .Skip((currentPage - 1) * pageSize)
    .Limit(pageSize)
    .SortByDescending(x => x.LastName)
    .ThenBy(x => x.Age)
    .ForEachAsync(
        student =>
        {
            Console.WriteLine($"S/N: {count}, \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}, Age: {student.Age}");
            count++;
        });

大多数情况下,我们将使用强类型对象,因为使用表达式树构建查询要容易得多。

Projection投影

我们也可以使用fluent接口的Project方法进行投影。我们指定一个类似于排序和过滤的投影。

使用表达式树或投影定义会导致稍微不同的行为。不同之处之一是,在使用投影定义语法时,必须明确地告诉它排除_id字段,否则,它会将其作为结果集的一部分返回。让我们更新代码,只返回FirstName

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
await collection.Find(FilterDefinition<Student>.Empty)
    .Skip((currentPage - 1) * pageSize)
    .Limit(pageSize)
    .SortByDescending(x => x.LastName)
    .ThenBy(x => x.Age)
    .Project("{FirstName: 1}")
    .ForEachAsync(
        student =>
        {
            Debug.WriteLine($"S/N: {count}, \t Id: {student.Id}, FirstName: {student.FirstName}, LastName: {student.LastName}, Age: {student.Age}");
            count++;
        });

使用更新的代码,我们的应用程序无法编译。给我们带来了另一个区别:通过投影定义,它隐式地将文档类型从Student转换为bsondocument,因此我们得到的是一个fluent对象,其结果将是一个BsonDocument(即使我们使用的是Student类型)。如果我们想和Student一起工作,我们必须指出我们仍然希望将类型保留为Student

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.Project<Student>("{FirstName: 1}")

因此,通过将Student设置为方法的类型来更新我们的代码,将得到以下输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Page 1

S/N: 1, 	 Id: 58469c732adc9f5370e50c9e, FirstName: Julie, LastName: , Age: 0
S/N: 2, 	 Id: 58469c732adc9f5370e50c9c, FirstName: Gregor, LastName: , Age: 0

Page 2

S/N: 1, 	 Id: 58469c732adc9f5370e50c9d, FirstName: Machiko, LastName: , Age: 0
S/N: 2, 	 Id: 58469c732adc9f5370e50ca0, FirstName: James, LastName: , Age: 0

Page 3

S/N: 1, 	 Id: 58469c732adc9f5370e50c9f, FirstName: Peter, LastName: , Age: 0

您可以看到,虽然我们只需要FirstName,但是FirstNameId被返回,而其他的则保持默认值。为了解决这个问题,我们显式地告诉它排除Id字段,并对投影定义进行以下更新:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.Project<Student>("{FirstName: 1, _id: 0}")

然后运行它,我们只返回FirstName,而其他值保持默认值:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Page 1

S/N: 1, 	 Id: 000000000000000000000000, FirstName: Julie, LastName: , Age: 0
S/N: 2, 	 Id: 000000000000000000000000, FirstName: Gregor, LastName: , Age: 0

Page 2

S/N: 1, 	 Id: 000000000000000000000000, FirstName: Machiko, LastName: , Age: 0
S/N: 2, 	 Id: 000000000000000000000000, FirstName: James, LastName: , Age: 0

Page 3

S/N: 1, 	 Id: 000000000000000000000000, FirstName: Peter, LastName: , Age: 0

我们也可以使用投影生成器。.Project<Student>(Builders<Student>.Projection.Include(x => x.FirstName).Exclude(x => x.Id))这与使用定义生成器进行排序和筛选类似。我们也可以使用表达式树进行投影,然后将其投影到不同的结果。以下代码将只返回first 和last name,并将其映射到匿名类型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int count = 1;
await collection.Find(FilterDefinition<Student>.Empty)
    .Project(x => new {x.FirstName, x.LastName})
    .ForEachAsync(
        student =>
        {
            Console.WriteLine($"{count}. \t FirstName: {student.FirstName} - LastName {student.LastName}");
            count++;
        });

Console.WriteLine();
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
1. 	 FirstName: Gregor - LastName Felix
2. 	 FirstName: Machiko - LastName Elkberg
3. 	 FirstName: Julie - LastName Sandal
4. 	 FirstName: Peter - LastName Cyborg
5. 	 FirstName: James - LastName Cyborg

您可能已经注意到,我们并没有显式地指明要排除Id,而是与另一种方式不同,这是因为在强类型表达式树中,它同意只返回您指定的那些字段,而排除其他字段。

总结

本文带着你一起研究了一下文档的排序,指定要跳过或限制返回的文档数量,以及如何进行投影。此篇文章中的实例代码摘录自原文,未像前几篇文章一样进行实际代码的验证。希望对你有所帮助。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-08-20 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C# LINQ 快速入门实战指南,建议收藏学习!
LINQ语言集成查询是一系列直接将查询功能集成到 C# 语言的技术统称。数据查询历来都表示为简单的字符串,没有编译时类型检查或 IntelliSense 支持。此外,需要针对每种类型的数据源了解不同的查询语言:SQL 数据库、XML 文档、各种 Web 服务等。然而,LINQ的出现改变了这一现状,它使查询成为了与类、方法和事件同等重要的高级语言构造。通过LINQ,开发者能够以声明性的方式查询和操作数据,极大地提高了开发效率和代码的可维护性。
追逐时光者
2025/04/15
1870
C# LINQ 快速入门实战指南,建议收藏学习!
在.Net Core中使用MongoDB的入门教程(二)
在上一篇文章中,讲到了MongoDB在导入驱动、MongoDB的连接,数据的插入等。 在.Net Core中使用MongoDB的入门教程(一) 本篇文章将接着上篇文章进行介绍MongoDB在.Ne
码农阿宇
2018/04/18
8730
在.Net Core中使用MongoDB的入门教程(二)
初识 MongoDB 和 .NET Core 入门
昨天搭建完毕 MongoDB 集群 后,开始计划了解 MongoDB ,并引入使用场景,这里介绍一下学习过程中的一些笔记,帮助读者快速了解 MongoDB 并使用 C# 对其进行编码。
痴者工良
2021/04/26
1.2K0
.NET Core MongoDB的简单使用
使用之前文章提到的MongoDB Compass用法分别添加数据库[myDb]和集合(表)[userinfos]信息,
GoodTime
2024/03/05
3410
.NET Core MongoDB的简单使用
.NET EF Core(Entity Framework Core)
1、Entity Framework Core(EF Core)是微软官方的ORM框架。优点:功能强大、官方支持、生产效率高、力求屏蔽底层数据库差异;缺点:复杂、上手门槛高、不熟悉EFCore的话可能会进坑。 2、Dapper。优点:简单,N分钟即可上手,行为可预期性强;缺点:生产效率低,需要处理底层数据库差异。 3、EF Core是 模型驱动 (Model-Driven)的开发思想,Dapper是 数据库驱动(DataBase-Driven)的开发思想的。没有优劣,只有比较。 4、性能: Dapper等≠性能高;EF Core≠性能差。 5、EF Core是官方推荐、推进的框架,尽量屏蔽底层数据库差异,.NET开发者必须熟悉,根据的项目情况再决定用哪个。
鱼找水需要时间
2024/03/23
8680
.NET EF Core(Entity Framework Core)
Dapper的封装、二次封装、官方扩展包封装,以及ADO.NET原生封装
前几天偶然看到了dapper,由于以前没有用过,只用过ef core,稍微看了一下,然后写了一些简单的可复用的封装。 Dapper的用法比较接近ADO.NET所以性能也是比较快。所以我们先来看看使用ADO.NET的时候我们怎么实现代码复用的封装。 ◆ 一、ADO.NET的封装案例 利用反射对ADO.NET进行封装,看代码: DBHelper.cs:这边用的是mysql,如果要用sqlserver将MySqlConnection换成SqlConnection即可。 这个写的比较简单,如果有复杂的sql可能就支
IT大咖说
2022/03/14
3K0
Top 15 不起眼却有大作用的 .NET功能集
目录 1. ObsoleteAttribute 2. 设置默认值属性: DefaultValueAttribute 3. DebuggerBrowsableAttribute 4. ??运算符 5. Curry 及 Partial 方法 6. WeakReference 7. Lazy 8. BigInteger 9. 非官方关键字:__arglist __reftype __makeref __refvalue 10. Environment.NewLine 11. ExceptionDispatch
葡萄城控件
2018/01/10
7410
Top 15 不起眼却有大作用的 .NET功能集
MongoDB分页的Java实现和分页需求的思考
传统关系数据库中都提供了基于row number的分页功能,切换MongoDB后,想要实现分页,则需要修改一下思路。
Ryan-Miao
2018/08/01
4.5K0
MongoDB分页的Java实现和分页需求的思考
菜鸟用Python操作MongoDB,看这一篇就够了
MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档、数组及文档数组,非常灵活。在这一节中,我们就来看看Python 3下MongoDB的存储操作。
IT派
2018/07/30
1.8K0
菜鸟用Python操作MongoDB,看这一篇就够了
.NET Core MongoDB数据仓储和工作单元模式封装
上一章我们把系统所需要的MongoDB集合设计好了,这一章我们的主要任务是使用.NET Core应用程序连接MongoDB并且封装MongoDB数据仓储和工作单元模式,因为本章内容涵盖的有点多关于仓储和工作单元的使用就放到下一章节中讲解了。仓储模式(Repository )带来的好处是一套代码可以适用于多个类,把常用的CRUD通用方法抽象出来通过接口形式集中管理,从而解除业务逻辑层与数据访问层之间的耦合,使业务逻辑层在存储、访问数据库时无须关心数据的来源及存储方式。工作单元模式(UnitOfWork)它是用来维护一个由已经被业务修改(如增加、删除和更新等)的业务对象组成的列表,跨多个请求的业务,统一管理事务,统一提交从而保障事物一致性的作用。
追逐时光者
2023/04/28
1.5K0
【深入浅出C#】章节 9: C#高级主题:LINQ查询和表达式
C#高级主题涉及到更复杂、更灵活的编程概念和技术,能够让开发者更好地应对现代软件开发中的挑战。其中,LINQ查询和表达式是C#高级主题中的一项关键内容,具有以下重要性和优势:
喵叔
2023/08/21
3K0
Python操作MongoDB看这一篇就够了
MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档、数组及文档数组,非常灵活。在这一节中,我们就来看看Python 3下MongoDB的存储操作。
python大志
2021/12/14
1.5K0
Modifying namespace in XML document programmatically
Modifying namespace in XML document programmatically static XElement stripNS(XElement root) { re
阿新
2018/04/12
1.5K0
Modifying namespace in XML document programmatically
ASP.NET Core AutoWrapper 自定义响应输出
AutoWrapper是一个简单可自定义全局异常处理程序和ASP.NET Core API响应的包装。他使用ASP.NET Core middleware拦截传入的HTTP请求,并将最后的结果使用统一的格式来自动包装起来.目的主要是让我们更多的关注业务特定的代码要求,并让包装器自动处理HTTP响应。这可以在构建API时加快开发时间,同时为HTTP响应试试我们统一的标准。
HueiFeng
2020/04/01
1.6K0
SpringBoot非官方教程 | 第八篇:springboot整合mongodb
方志朋
2017/12/29
1.2K0
使用xUnit为.net core程序进行单元测试(下1)
第1部分: https://cloud.tencent.com/developer/article/1019835
solenovex
2018/02/10
1.5K0
使用xUnit为.net core程序进行单元测试(下1)
使用c#对MongoDB进行查询(1)
    在MongoDB.Bson命名空间下存在一个BsonDocument类,它是MongoDB的文档对象,代表着MongoDB中不规则数据一条条实体模型。可以使用BsonDocument对不规则数据进行操作,这个类型继承了IEnumberable<>类,也就是说又将每一个实体模型看做一个集合,我们可以使用下标方式获取实体模型中的值
莫问今朝
2019/02/25
3.1K0
Python操作MongoDB看这一篇就够了
MongoDB是由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统,其内容存储形式类似JSON对象,它的字段值可以包含其他文档、数组及文档数组,非常灵活。在这一节中,我们就来看看Python 3下MongoDB的存储操作。 1. 准备工作 在开始之前,请确保已经安装好了MongoDB并启动了其服务,并且安装好了Python的PyMongo库。 2. 连接MongoDB 连接MongoDB时,我们需要使用PyMongo库里面的MongoClient。一般来说,传入MongoDB的
崔庆才
2018/06/25
23K0
EF Core关系配置
关系配置: EF Core中实体之间关系的配置的套路: HasXXX(…).WithXXX(…); 有XXX、反之带有XXX。 XXX可选值One、Many。
鱼找水需要时间
2024/03/24
2880
EF Core关系配置
值得 .NET 开发者了解的15个特性
本文列举了 15 个值得了解的 C# 特性,旨在让 .NET 开发人员更好的使用 C# 语言进行开发工作。 1. ObsoleteAttribute ObsoleteAttribute 适用于除组件、模块、参数和返回值以外的所有程序元素。将元素标记为 obsolete,可以通知用户该元素将在未来的版本中删除。 IsError - 设置为 true,编译器将在代码中使用这个属性时,提示错误。 public static class ObsoleteExample { // Mark OrderDet
葡萄城控件
2018/03/27
9750
值得 .NET 开发者了解的15个特性
推荐阅读
相关推荐
C# LINQ 快速入门实战指南,建议收藏学习!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验