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

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

文章目录

  • 【Entity Framework】聊一聊EF如何使用数据库函数
    • 一、数据库函数的类型
    • 二、内置函数与用户定义的函数
    • 四、聚合函数、标量函数和表值函数
    • 五、Niladic函数
    • 六、EF Core 中的数据库函数映射
      • 6.1 内置函数映射
      • 6.2 EF.Functions 映射
      • 6.3 用户定义的函数映射

在这里插入图片描述

数据库函数是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 查询调用的用户定义的函数时,此功能非常有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/1469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis入门到通关之数据结构解析-QuickList

文章目录 ☃️前提概要☃️ 配置项相关☃️简要源码☃️总结 Redis中的 QuickList 是一种特殊的数据结构,用于存储列表类型的数据。它的设计目的是在内存中高效地存储和操作大量的列表元素,尤其是当列表长度很大时。 QuickList的内部结构是一个由多个节…

ARM与单片机有啥区别?

初学者必知:ARM与单片机到底有啥区别?1、软件方面这应该是最大的区别了。引入了操作系统。为什么引入操作系统?有什么好处嘛? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「ARM的资料从专业入门到高级教…

完全日期(蓝桥杯)

文章目录 完全日期题目描述模拟 完全日期 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。 例如:2021 年 6 月 5 日…

Z变换和离散傅里叶变换区别

Z变换和离散傅里叶变换(DFT)都是数字信号处理中的重要工具,它们之间有几个关键的区别: 定义域: Z变换是在整个Z平面上定义的,可以处理信号的整个频率范围。 DFT仅在单位圆上定义,对应于周期信号…

【Linux驱动层】iTOP-RK3568学习之路(二):vscode中设置头文件路径-完成代码自动补全

在Ubuntu下用vscode写Linux驱动层的时候&#xff0c;需要添加头文件&#xff1a; #include<linux/module.h> #include<linux/init.h> #include<linux/kernel.h>但vscode没有智能提示&#xff0c;因此需要我们手动添加自己的头文件路径&#xff1a; topeetu…

嵌入式Linux开发实操(十七):Linux Media Infrastructure userspace API

视频和无线电流媒体设备使用的Linux内核到用户空间API,包括摄像机、模拟和数字电视接收卡、AM/FM接收卡、软件定义无线电(SDR)、流捕获和输出设备、编解码器设备和遥控器。典型的媒体设备硬件如下: 媒体基础设施API就是用于控制此类设备的,分五个部分。 第一部分V4L2 API…

设计模式学习笔记 - 开源实战三(下):借助Google Guava学习三大编程范式中的函数式编程

概述 现在主流的编程范式主要有三种&#xff0c;面向过程、面向对象和函数式编程。在理论部分&#xff0c;已经介绍了前面两种编程范式。本章再讲讲剩下的编程范式&#xff0c;函数式编程。 函数式编程并非是一个很新的东西&#xff0c;早在 50 年前就已经出现。近几年&#…

全量知识系统 程序详细设计 之“因果关系模型”(QA百度搜索)

Q1. 今天聊聊全量知识系统&#xff08;简称“全知系统”&#xff09;中 对“因果”的理解。&#xff08;地位、意义和作用&#xff09; 在全量知识系统&#xff08;全知系统&#xff09;中&#xff0c;“因果”的理解占据着核心地位&#xff0c;其意义和作用不容忽视。以下是对…

AI安全之问:我们的智能助手真的安全吗?

在我们日益依赖人工智能来撰写文档、编写程序代码、甚至创作艺术作品的今天&#xff0c;我们是否曾经想过这些智能系统可能面临的被恶意操纵的风险&#xff1f; 分享几个网站 GPT-3.5研究测试&#xff1a; https://hujiaoai.cn GPT-4研究测试&#xff1a; https://higpt4.cn…

MKS 质量MFC流量控制器原理及应用课件PPT

MKS 质量MFC流量控制器原理及应用课件PPT

Git | Git基本命令

Git | Git基本操作 文章目录 Git | Git基本操作一、创建Git本地仓库1、创建Git仓库2、配置Git3、理解工作区、暂存区、版本库关系 二、添加、修改与查看添加文件查看历史提交记录 修改文件查看.git文件 三、版本回退版本回退撤销修改尚未add已add但还未commit已add并commit 删除…

安信可 ESP_01SWIFI模块的使用 (电脑通过usb转tll模块连接wifi模块进行调试)

一&#xff1a;需要用到的模块 &#xff08;1&#xff09;安信可的ESP_01wifi模块 ESP-01是深圳安信可科技基于ESP8266芯片开发的串口wifi模块&#xff0c;模组集成了透传功能&#xff0c;即买即用&#xff0c;支持串口指令集&#xff0c;用户通过串口即可实现网络访问…

STM32相关手册

目录 数据手册 STM32F103C8T6数据手册 STM32F429IGT6数据手册 参考手册 STM32F103C8T6参考手册 STM32F429IGT6参考手册 数据手册 STM32F103C8T6数据手册 链接&#xff1a;https://url80.ctfile.com/d/38076880-60948910-e7c11b?p9868 密码&#xff1a;9868 STM32F429IGT6数…

List的介绍

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1…

ASP.Net MVC 登录页面实现RSA非对称加密

一、什么是RSA非对称加密 RSA是1977年由罗纳德李维斯特&#xff08;Ron Rivest&#xff09;、阿迪萨莫尔&#xff08;Adi Shamir&#xff09;和伦纳德阿德曼&#xff08;Leonard Adleman&#xff09;一起提出的。 RSA算法是一种非对称加密算法&#xff0c;与对称加密算法不同…

广州大学2023-2024学年第一学期《计算机网络》A卷

选择题&#xff1a; 考得和往年试卷&#xff08;往年试卷&#xff0c;我都做了&#xff0c;但是都是些09年、10年、11年、12年、13年的试卷&#xff0c;离现在最近的都是17-28年的。选择填空题的参考性已经不高了&#xff0c;但是大题的题型还是差不多的。&#xff09;大相径庭…

Java之继承和多态

继承 一 、继承相关基础 1.1 为什么需要继承 先看下代码 // Dog.java public class Dog { string name ; int age ; float weight ; public void eat (){ System . out . println ( name " 正在吃饭 " ); } public void sleep (){ System . ou…

Spring Cloud Feign面试题

Spring Cloud Feign面试题 1. Feign基础概念1.1 什么是Feign&#xff1f;1.2 Feign的主要用途是什么&#xff1f;1.3 Feign和OpenFeign有何区别&#xff1f;1.4 Feign和Ribbon以及RestTemplate的区别是什么&#xff1f; 2. Feign的使用和配置2.1 如何创建一个Feign客户端&#…

如何在本地创建一个新的Git仓库?

文章目录 **步骤一&#xff1a;开启项目之旅****步骤二&#xff1a;启动Git引擎****步骤三&#xff1a;验证仓库初始化情况****步骤四&#xff1a;填充项目内容****步骤五&#xff1a;保存更改——初次提交****&#xff08;可选步骤六&#xff1a;关联远程仓库并推送&#xff0…

基于Spring Cloud Alibaba+Skywalking的分布式链路追踪设计

胡弦&#xff0c;视频号2023年度优秀创作者&#xff0c;互联网大厂P8技术专家&#xff0c;Spring Cloud Alibaba微服务架构实战派(上下册)和RocketMQ消息中间件实战派(上下册)的作者&#xff0c;资深架构师&#xff0c;技术负责人&#xff0c;极客时间训练营讲师&#xff0c;四…