第二十八节: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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。