第二十八节:EFCore6.x版本新功能总结
一. Linq改进
(参考官方文档:https://docs.microsoft.com/zh-cn/ef/core/what-is-new/ef-core-6.0/whatsnew)
1. IsNullOrWhitespace
(1).含义:判断字符串是否为 Null 或 String.Empty 或 空白字符组成的字符串 (eg: " ")
区别于:IsNullOrEmpty,仅仅判断是否为 Null 或 String.Empty
(2). 生成的SQL语句改进了
{
using var db = new EFCore6xDBContext();
var data = db.UserInfo.Where(u => string.IsNullOrWhiteSpace(u.userName)).ToList();
//区别于IsNullOrEmpty
var data2 = db.UserInfo.Where(u => string.IsNullOrEmpty(u.userName)).ToList();
foreach (var item in data)
{
Console.WriteLine($"id:{item.id},addTime:{item.addTime}");
}
}
现在翻译的SQL语句:
SELECT [u].[id], [u].[addTime], [u].[delflag], [u].[userAge], [u].[userGender], [u].[userName], [u].[userPwd]
FROM [UserInfo] AS [u]
WHERE ([u].[userName] IS NULL) OR ([u].[userName] = N'')
旧版本翻译的SQL语句:
SELECT [u].[id], [u].[addTime], [u].[delflag], [u].[userAge], [u].[userGender], [u].[userName], [u].[userPwd]
FROM [UserInfo] AS [u]
WHERE ([u].[userName] IS NULL) OR (LTRIM(RTRIM([u].[userName])) = N'')
(3).区别于IsNullOrEmpty翻译:
SELECT [u].[id], [u].[addTime], [u].[delflag], [u].[userAge], [u].[userGender], [u].[userName], [u].[userPwd]
FROM [UserInfo] AS [u]
WHERE ([u].[userName] IS NULL) OR ([u].[userName] LIKE '')
2. Concat
EFCore6.0之前,string.Concat 时只有两个参数,EF Core 6.0 支持翻译三个和四个参数的 string.Concat.
{
using var db = new EFCore6xDBContext();
var data = db.UserInfo.Where(u => string.Concat(u.userName, u.id, u.userGender) == "hhh").ToList();
}
翻译的SQL语句:
SELECT [u].[id], [u].[addTime], [u].[delflag], [u].[userAge], [u].[userGender], [u].[userName], [u].[userPwd]
FROM [UserInfo] AS [u]
WHERE (COALESCE([u].[userName], '') + ([u].[id] + COALESCE([u].[userGender], ''))) = 'hhh'
3. Substring
EFCore6.0之前,string.Substring 只支持两个参数的重载,EF Core 6.0 支持翻译单个参数的 string.Substring。
{
using var db = new EFCore6xDBContext();
var data = db.UserInfo.Select(u => u.userName.Substring(1)).ToList();
foreach (var item in data)
{
Console.WriteLine(item);
}
}
翻译的SQL语句:
SELECT SUBSTRING([u].[userName], 1 + 1, LEN([u].[userName]))
FROM [UserInfo] AS [u]
4.TagWithCallSite
从 EF Core2.2 开始,可以给查询添加一个标签,以达到更好的调试目的。EF Core 6.0 更进一步,现在你可以用 LINQ 代码的文件名和行号来标记查询。
{
using var db = new EFCore6xDBContext();
var data = db.UserInfo.TagWithCallSite().ToList();
}
5. EF.Functions.Random
含义:EFCore6.0 引入了一个新的 EF.Functions.Random 方法,它映射了 SQL 函数 RAND(),目前已经实现了对 SQL Server、SQLite 和 Cosmos 的翻译。
{
using var db = new EFCore6xDBContext();
var data = db.UserInfo.Where(u => u.userAge == (int)(EF.Functions.Random() * 5.0)).ToList();
}
翻译的SQL语句:
SELECT [u].[id], [u].[addTime], [u].[delflag], [u].[userAge], [u].[userGender], [u].[userName], [u].[userPwd]
FROM [UserInfo] AS [u]
WHERE [u].[userAge] = CAST((RAND() * 5.0E0) AS int)
6. GroupBy
详见上述官方文档。
二. 其它改进
!
- 作 者 : Yaopengfei(姚鹏飞)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 声 明1 : 如有错误,欢迎讨论,请勿谩骂^_^。
- 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
2018-07-04 第一节:.Net版基于WebSocket的聊天室样例
2017-07-04 06-开闭原则(OCP)
2017-07-04 05-迪米特法则(LOD 又名: 最少知道原则)
2017-07-04 04-接口隔离原则(ISP)