暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[译] dotConnect for MySQL 8.21 中对新数据类型的支持和其他改进

原创 秦朝阳 2022-06-27
245

原文地址;Support for New Data Types and Other Improvements in dotConnect for MySQL 8.21
原文作者:DotConnect Team

新版本的 Devart dotConnect for MySQL 包含对 Entity Framework Core 支持的重大改进。我们支持新的数据类型 Uri、IPAddress、PhysicalAddress 并扩展了将 LINQ 查询转换为 SQL 的功能。此外,我们改进了对在 EF6 的 LINQ 查询中使用 JSON 的支持。

Uri 数据类型映射

对于 Entity Framework Core 3、5 和 6,dotConnect for MySQL 现在支持将 Internet/Intranet System.Uri 类型映射到 Oracle 字符串数据类型。

public class Blog {
  public int Id { get; set; }
  public Uri Url { get; set; } 
}
复制
CREATE TABLE Blog ( 
  Id int AUTO_INCREMENT UNIQUE NOT NULL,
  Url longtext NOT NULL, 
  PRIMARY KEY (Id) 
)
复制

IPAddress 和 PhysicalAddress 数据类型映射

对于 Entity Framework Core 5 和 6,dotConnect for MySQL 现在支持将网络类型 System.Net.IPAddress 和 System.Net.NetworkInformation.PhysicalAddress映射 到 MySQL 字符串数据类型。

public class AccessLog { 
  public int Id { get; set; } 
  public Uri Url { get; set; } 
  public IPAddress IP { get; set; } 
  public DateTime Timestamp { get; set; } 
}
复制
CREATE TABLE AccessLog ( 
  Id int AUTO_INCREMENT UNIQUE NOT NULL, 
  Url longtext NOT NULL, IP varchar(45) NOT NULL, 
  `Timestamp` datetime NOT NULL, 
   PRIMARY KEY (Id)
)
复制

EF Core LINQ to Entities 改进

EF Core 3、EF Core 5、EF Core 6 支持 LINQ 查询中使用的以下类成员的 SQL 翻译:

  • String类的静态方法 IsNullOrWhiteSpace()
  • DateTime 类的静态属性 Today 和实例属性 DayOfWeek
  • 静态方法 Sqrt()、Max()、Min()、Log()、Log10()、Sin()、Cos()、Tan()、
    Asin()、Acos()、Atan()、Atan2()数学课_

EF Core 5 和 EF Core 6 支持 LINQ 查询中使用的以下类成员的 SQL 翻译:

  • 静态方法 Abs()、Round()、Truncate()、Floor()、Ceiling()、Pow()、Sqrt()、Max()、Min()、Log()、Log10()、Sin()、 MathF类的 Cos()、Tan()、Asin()、Acos()、Atan()、Atan2 ()
    EF Core 6 支持 LINQ 查询中使用的以下类成员的 SQL 翻译:

  • Math和MathF类的静态方法 Log2()

JSON 的 EF6 LINQ to Entity 改进

尽管 EF Core 进行了开发,但 EF6 仍然是 ORM 的当前版本,由于 EF6 和 EF Core 之间存在的功能差距以及行为差异,对于某些项目来说,从该版本迁移到 EF Core 很困难。因此,我们主要根据用户请求继续完善 EF6 功能。

在这个版本中,我们改进了对存储在 MySQL JSON 数据类型中的数据的支持。

public class JsonTable { 

    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int Id { get; set; } 

    [Column(TypeName = "json")]
    public string JObject { get; set; } 
}
复制

MySqlJsonFunctions 类包含一个 Extract() 方法,用于从 JSON 值中获取字段的文本值:

var query = context.JsonTable.Where(t => MySqlJsonFunctions.Extract(t.JObject, "$.name") == "Apple").ToList();

SELECT 
Extent1.Id,
Extent1.JObject 
FROM JsonTable AS Extent1 
WHERE JSON_EXTRACT(Extent1.JObject, '$.name') = 'Apple'

复制

可能还需要处理类型化的非字符串值,因此已将方法添加到 MySqlJsonFunctions 类以获取其他 .NET 类型的值:ExtractAsByte()、ExtractAsSByte()、ExtractAsInt16()、ExtractAsInt32()、ExtractAsInt64 ()、ExtractAsSingle()、ExtractAsDouble()、ExtractAsDecimal()、ExtractAsDateTime()。

现在,可以编写这样的 LINQ 查询:

var query = context.JsonTable 
  .Where(t => MySqlJsonFunctions.ExtractAsInt32(t.JObject, "$.weight") > 10) 
  .Select(t => new { 
    Name = MySqlJsonFunctions.Extract(t.JObject, "$.name"), 
    Weight = MySqlJsonFunctions.ExtractAsDecimal(t.JObject, "$.weight"), 
    Date = MySqlJsonFunctions.ExtractAsDateTime(t.JObject, "$.date") 
}).ToList();
SELECT JSON_EXTRACT(Extent1.JObject, '$.name') AS C1,
JSON_EXTRACT(Extent1.JObject, '$.weight') AS C2,
CAST(JSON_UNQUOTE(JSON_EXTRACT(Extent1.JObject, '$.date')) AS DATETIME) AS C3
FROM JsonTable AS Extent1
WHERE JSON_EXTRACT(Extent1.JObject, '$.weight') > 10

复制

结论

我们很高兴为 MySQL 提供更新的 Devart dotConnect,它具有新的实体框架功能。此外,计划继续开发 EF 和 EF Core,扩展对 LINQ 查询的支持,并添加对映射新数据类型的支持。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论