c# - EF Core Compress 解压列

标签 c# sql-server entity-framework-core

以一个带有 的简单 poco 为例。编号 和一个名为 的字符串属性数据 .
调用 COMPRESS(data) 的最佳方式是什么?在使用 保存实体之前英孚核心 并调用 DECOMPRESS(data)在加载它。数据库列当然是 VARBINARY。
详细的:
编写自定义 SQL 以实现此目的(基于上述示例)将如下所示:

SELECT Id, DECOMPRESS(@Data) as [Data]
FROM table
用于选择并像这样插入实体:
INSERT INTO table
VALUES(@Id, COMPRESS(@Data))
笔记:
它是 SQL Server。
当前的字符串长度可以达到几千,如固定长度 NVARCHAR在 DB 端使用 PAGE 或 ROW 压缩不是一种选择。

最佳答案

使用转换似乎是最好的方法。因为越早压缩数据,生成的网络 I/O 就越少。此外,压缩会消耗宝贵的 SQL 服务器 CPU 周期,并可能影响 SQL 服务器的性能。

public class YourEntityTypeConfigruation : IEntityTypeConfiguration<YourEntity>
{
    public void Configure(EntityTypeBuilder<YourEntity> builder)
    {
        builder.Property(e => e.Data)
            .HasConversion(
                v => Zip(v),
                v => Unzip(v));
    }
    
    public static void CopyTo(Stream src, Stream dest) {
        byte[] bytes = new byte[4096];

        int cnt;

        while ((cnt = src.Read(bytes, 0, bytes.Length)) != 0) {
            dest.Write(bytes, 0, cnt);
        }
    }

    public static byte[] Zip(string str) {
        var bytes = Encoding.UTF8.GetBytes(str);

        using (var msi = new MemoryStream(bytes))
        using (var mso = new MemoryStream()) {
            using (var gs = new GZipStream(mso, CompressionMode.Compress)) {
                //msi.CopyTo(gs);
                CopyTo(msi, gs);
            }

            return mso.ToArray();
        }
    }

    public static string Unzip(byte[] bytes) {
        using (var msi = new MemoryStream(bytes))
        using (var mso = new MemoryStream()) {
            using (var gs = new GZipStream(msi, CompressionMode.Decompress)) {
                //gs.CopyTo(mso);
                CopyTo(gs, mso);
            }

            return Encoding.UTF8.GetString(mso.ToArray());
        }
    }
}
创建 View 时,可以使用 SQL 服务器方法
CREATE VIEW MyView
AS
SELECT Id, DECOMPRESS(Data) as [Data]
FROM table
mapping它在 EF 上下文中
对于插入/更新,您需要存储过程来压缩数据。违背了使用 Entity Framework 来跟踪实体更改的目的。

关于c# - EF Core Compress 解压列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63048776/

相关文章:

c# - 批量注册 IEntityTypeConfiguration<> Entity Framework 核心

c# - 覆盖具有 'dibs' 的类型的 Equals 和 GetHashCode?

sql - 在 Management Studio 中创建 CHANGE 脚本?

c# - 在 C# 代码中使用 T-SQL 自定义函数

sql-server - SQL 查询以获取最后 4 个季度和年份的最后 2 位数字

c# - MissingMethodException DbSet.ToList 异常

c# - 如何将新字符串添加到 REG_MULTI_SZ 类型的注册表项?

c# - 记录创建的实时工作流在记录提交到数据库之前运行

c# - for 循环中计数器变量的范围是什么?

C#、 Entity Framework 核心和 PostgreSql : inserting a single row takes 20+ seconds