第二十八节: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 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
posted @   Yaopengfei  阅读(294)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 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)
点击右上角即可分享
微信分享提示