【Entity Framework】聊一聊EF如何使用数据库函数

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 【Entity Framework】聊一聊EF如何使用数据库函数


数据库函数是C#方法数据库等效项。数据库函数可以使用零个或更多个参数调用,它会根据参数值计算结果。大多数使用SQL进行查询的数据库都支持数据库函数。因此,EF Core查询转换生成的SQL也允许调用数据库函数。在EF Core种,C#方法不必严格地转换为数据库函数。


  • C#方法可能没有等效的数据库函数。
  • String.IsNullOrEmpty方法会转换为 null 检查和与数据库中空字符串的比较,而不会转换为一个函数。
  • String.Equals(String,StringComparison)方法没有数据库等效项,因为在数据库中表示或模拟字符串比较并非易事。
  • 数据库函数可能没有等效的C#方法。C#种的??运算符没有任何方法,它会转换为数据库种的COALESCE函数。


一、数据库函数的类型

EF Core SQL 生成支持可在数据库中使用的部分函数。 此限制源自采用给定数据库函数的 LINQ 表示查询的能力。 而且,每个数据库对数据库函数的支持各异,因此 EF Core 提供了一个通用子集。 数据库提供程序可免费将 EF Core SQL 生成扩展为支持更多的模式。 下面是 EF Core 支持并唯一标识的数据库函数类型。 这些条目也有助于了解哪些转换是 EF Core 提供程序内置的。


二、内置函数与用户定义的函数

内置函数是数据库中预定义的,而用户定义的函数是由数据库用户显式定义的。 EF Core 将查询转换为使用数据库函数时,它使用内置函数来确保该函数在数据库中始终可用。 在某些数据库中,需要了解内置函数的特征,才能正确生成 SQL。 例如 SqlServer 要求使用架构限定的名称调用各个用户定义的函数。 但 SqlServer 中的内置函数没有架构。 PostgreSQL 使用 public 架构定义内置函数,但可使用架构限定的名称调用它们。


四、聚合函数、标量函数和表值函数

标量函数将标量值(如整数或字符串)用作参数,并返回标量值作为结果。 可在 SQL 中任意可以传递标量值的地方使用标量函数。

聚合函数将一系列的标量值用作参数,并返回标量值作为结果。 聚合函数应用于整个查询结果集或应用 GROUP BY 运算符所生成的一组值。

表值函数将标量值用作参数,并返回一系列的行作为结果。 表值函数用作 FROM 子句中的表源。


五、Niladic函数

Niladic 函数是特殊的数据库函数,没有任何参数,并且不得使用括号调用。 它们类似于 C# 实例上的属性/字段访问。 Niladic 函数不同于无参数函数,因为后者需要使用空白括号。 始终需要使用括号的数据库函数没有特殊的名称。 另外一部分基于参数计数的数据库函数是可变参数函数。 可变参数函数可以采用不同的参数数量进行调用。


六、EF Core 中的数据库函数映射

EF Core 支持三种不同的方式,来实现 C# 函数和数据库函数之间的映射。

6.1 内置函数映射

默认情况下,EF Core 提供程序通过基元类型为各种内置函数提供映射。 例如,在 SqlServer 中,String.ToLower()会转换为 LOWER。 用户可以通过此功能无缝地使用 LINQ 编写查询。 通常,我们提供的数据库转换生成的结果要与客户端的 C# 函数所生成的内容相同。 为实现此目的,有时实际的转换可能比数据库函数更为复杂。 在某些情况下,我们也会提供最适当的转换,而不是提供匹配的 C# 语义。 同样的功能也可用于为某些 C# 成员访问提供通用的转换。 例如,在 SqlServer 中,String.Length 会转换为 LEN。 除了提供程序外,插件编写器也可以添加更多的转换。 当插件添加对将更多类型作为基元类型的支持,并想要通过这些类型转换方法时,这种扩展性非常有用。

6.2 EF.Functions 映射

由于并非所有数据库函数都有等效的 C# 函数,因此 EF Core 提供程序提供了特殊的 C# 方法来调用某些数据库函数。 这些方法通过 EF.Functions 定义为扩展方法来用于 LINQ 查询中。 这些方法是特定于提供程序的,因为它们与特定数据库函数密切相关。 因此,适用于某个提供程序的方法很可能不适用于任何其他提供程序。 此外,由于这些方法旨在调用所转换查询中的数据库函数,因此尝试在客户端上计算这些方法会引发异常。

6.3 用户定义的函数映射

除了 EF Core 提供程序提供的映射以外,用户还可以定义自定义映射。 用户定义的映射会根据用户需求扩展查询转换。 当数据库中有用户想要从 LINQ 查询调用的用户定义的函数时,此功能非常有用。

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
26天前
|
SQL 数据挖掘 测试技术
南大通用GBase8s数据库:LISTAGG函数的解析
南大通用GBase8s数据库:LISTAGG函数的解析
|
26天前
|
SQL 测试技术 数据库
|
2月前
|
SQL 数据库 数据库管理
数据库SQL函数应用技巧与方法
在数据库管理中,SQL函数是处理和分析数据的强大工具
|
4月前
|
数据库 C# 开发者
WPF开发者必读:揭秘ADO.NET与Entity Framework数据库交互秘籍,轻松实现企业级应用!
【8月更文挑战第31天】在现代软件开发中,WPF 与数据库的交互对于构建企业级应用至关重要。本文介绍了如何利用 ADO.NET 和 Entity Framework 在 WPF 应用中访问和操作数据库。ADO.NET 是 .NET Framework 中用于访问各类数据库(如 SQL Server、MySQL 等)的类库;Entity Framework 则是一种 ORM 框架,支持面向对象的数据操作。文章通过示例展示了如何在 WPF 应用中集成这两种技术,提高开发效率。
69 0
|
4月前
|
SQL 数据处理 数据库
|
4月前
|
Java 前端开发 Spring
技术融合新潮流!Vaadin携手Spring Boot、React、Angular,引领Web开发变革,你准备好了吗?
【8月更文挑战第31天】本文探讨了Vaadin与Spring Boot、React及Angular等主流技术栈的最佳融合实践。Vaadin作为现代Java Web框架,与其他技术栈结合能更好地满足复杂应用需求。文中通过示例代码展示了如何在Spring Boot项目中集成Vaadin,以及如何在Vaadin项目中使用React和Angular组件,充分发挥各技术栈的优势,提升开发效率和用户体验。开发者可根据具体需求选择合适的技术组合。
95 0
|
4月前
|
SQL 关系型数据库 数据库连接
Entity Framework Core 入门教程来袭!快速上手强大的 ORM 工具,开启高效数据库开发之旅!
【8月更文挑战第31天】Entity Framework Core(EF Core)是一个轻量且可扩展的对象关系映射(ORM)框架,允许开发者使用 .NET 语言操作数据库而无需直接编写 SQL 语句。本教程涵盖 EF Core 的安装、数据库上下文创建、数据库连接配置及常见数据库操作(如添加、查询、更新和删除),并介绍如何利用数据库迁移功能安全地更改数据库结构。通过本教程,你可以快速掌握 EF Core 的基本用法,提高开发效率。
179 0
|
4月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
483 0
|
4月前
|
存储 开发框架 .NET
ASP.NET Web Api 使用 EF 6,DateTime 字段如何取数据库服务器当前时间
ASP.NET Web Api 使用 EF 6,DateTime 字段如何取数据库服务器当前时间
|
4月前
|
SQL 关系型数据库 数据库
EF Core连接PostgreSQL数据库
EF Core连接PostgreSQL数据库
63 0