【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的资料从专业入门到高级教…

【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…

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;用户通过串口即可实现网络访问…

List的介绍

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

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

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

双向链表-(增删减改)

声明 单链表&#xff08;增删减改&#xff09;单链表实现通讯录项目链表的专用题型-CSDN博客https://blog.csdn.net/Jason_from_China/article/details/137722729 双链表和单链表就是异曲同工 链表的分类 这里我们主要讲解的是不带头的单向不循环链表&#xff0c;在题型解析里面…

将Python机器学习模型集成到C++ Qt客户端应用程序中|Qt调用python详解

0、前言 有几个不同的选项可以将你的Python机器学习模型集成到你的C Qt客户端应用程序中。以下是一些可能的解决方案&#xff1a; 创建API&#xff1a; 将你的机器学习模型部署为一个API服务。你可以使用像Flask这样的轻量级Web框架来创建一个简单的HTTP服务。这样&#xff0…

JAVA高阶私房菜:JVM虚拟机核心概念及参数微调实验

目录 基础快速掌握 什么是JVM虚拟机 JVM的的实现 操作系统-虚拟机-JRE-JDK的关系 生产环境部署JDK还是JRE JVM内存组成部分和堆空间分布 内存组成 堆空间内存分布 内存分布 堆空间分配 JVM堆空间垃圾回收流程及JVM参数 垃圾回收流程 JVM参数分类 JVM参数格式分类 …

浅识数据结构之时间复杂度

P. S.&#xff1a;以下代码均在VS2019环境下测试&#xff0c;不代表所有编译器均可通过。 P. S.&#xff1a;测试代码均未展示头文件stdio.h的声明&#xff0c;使用时请自行添加。 文章目录 前言一. 时间复杂度1.1 时间复杂度的概念1.2 时间复杂度如何计算1.3 时间复杂度如何表…

XSS-跨站脚本攻击 漏洞详解

一、初识XSS 1、什么是XSS XSS全称跨站脚本(Cross Site Scripting)&#xff0c;为避免与层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;故缩写为XSS。这是一种将任意 Javascript 代码插入到其他Web用户页面里执行以达到攻击目的的漏洞。攻击者利用浏览器的动…

【已解决简单好用】notepad++怎么设置中文

打开Notepad软件。点击软件界面顶部菜单栏中的“Settings”选项。在下拉菜单中选择“Preferences”进行语言设置。在打开的设置窗口中&#xff0c;找到“General”选项。在“General”选项中&#xff0c;找到“Localization”&#xff08;界面语言&#xff09;项。在下拉菜单中…

Modern CSV for Mac:强大的CSV文件编辑器

Modern CSV for Mac是一款功能强大的CSV文件编辑器&#xff0c;专为Mac用户设计&#xff0c;提供直观易用的界面和丰富的功能&#xff0c;使用户能够轻松编辑和管理CSV文件。 Modern CSV for Mac v2.0.6激活版下载 这款软件支持快速导入和导出CSV文件&#xff0c;方便用户与其他…

【Hadoop】- MapReduce YARN的部署[8]

目录 一、部署说明 二、集群规划 三、MapReduce配置文件 四、YARN配置文件 五、分发配置文件 六、集群启动命令 七、查看YARN的WEB UI 页面 一、部署说明 Hadoop HDFS分布式文件系统&#xff0c;我们会启动&#xff1a; NameNode进程作为管理节点DataNode进程作为工作节…

大数据Hive中的UDF:自定义数据处理的利器(上)

文章目录 1. 前言2. UDF与宏及静态表的对比3. 深入理解UDF4. 实现自定义UDF 1. 前言 在大数据技术栈中&#xff0c;Apache Hive 扮演着数据仓库的关键角色&#xff0c;它提供了丰富的数据操作功能&#xff0c;并通过类似于 SQL 的 HiveQL 语言简化了对 Hadoop 数据的处理。然而…

综合案例(前端代码练习):猜数字和表白墙

目录 一、猜数字 html代码&#xff1a; 点击 猜 按钮的js代码&#xff1a; 点击 重开游戏 按钮的js代码&#xff1a; 整体代码&#xff1a; 页面效果&#xff1a; 二、留言板 css代码&#xff1a; html代码&#xff1a; js代码&#xff08;主逻辑在这&#xff09;&am…