第二十八节: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 @ 2022-07-04 16:10  Yaopengfei  阅读(280)  评论(1编辑  收藏  举报