【问题标题】:EF core fetch string as enum typeEF核心获取字符串作为枚举类型
【发布时间】:2022-01-22 16:10:32
【问题描述】:

我在一个 MYSQL 数据库上运行一个大的SELECT,其数量级为 100.000 行。 我正在获取的表有一个名为 type 的列,它有 4 个不同的字符串值。

|Id|Type  |MetaKey|MetaValue|
|===========================|
|01|'line'|'AKey' |AValue   |
|02|'line'|'AKey1'|AValue   |
|03|'Ship'|'AKey2'|AValue   |
|04|'Fee' |'AKey3'|AValue   |
|05|'Ship'|'AKey4'|AValue   |

目前主要的瓶颈似乎是网络传输,所以我想最好将这 4 个不同的字符串值转换为一个 int enum(或一些小东西),以便为传输节省内存。

我猜想 MYSQL CASE 将允许在 SQL 中执行此操作。

EF 核心可以做到这一点吗? LINQ 语法是什么样的?

重申一下 - 我希望在数据库中完成转换,而不是在 C# 客户端中。

编辑:抱歉 - 我很困惑,这是一个 MYSQL 数据库而不是 MSSQL 数据库。

【问题讨论】:

  • 为什么不首先有一个 int 列?
  • @Fildor 好问题 - 但这不是我的数据库,我只是从中提取数据。我对数据库的外观没有发言权。
  • EF 核心具有称为“价值转换”的功能。它在客户端进行转换,但它会是一个非常方便的解决方案。
  • @GertArnold 是的,我想这么多。不过,这主要是关于性能。
  • @sommmen 性能不受价值转换的影响。无论如何,您都需要将该字符串解析为枚举

标签: c# mysql entity-framework-core ef-core-6.0


【解决方案1】:

您的查询应如下所示:

public enum MyEnum
{
    Unknown = 0,
    Line = 1,
    Ship = 2,
    Fee = 3
}
var query = 
    from t in ctx.Table
    select new 
    {
        c.Id,
        c.MetaKey,
        c.MetaValue,
        Type = (MyEnum)(
            c.Type == "line" ? 1 :
            c.Type == "Ship" ? 2 :
            c.Type == "Fee" ? 3 : 0)
    };

EF Core 生成返回整数的最优表达式:

CAST(CASE
    WHEN [e].[Type] = N'line' THEN 1
    WHEN [e].[Type] = N'Ship' THEN 2
    WHEN [e].[Type] = N'Fee' THEN 3
    ELSE 0
END AS int)

【讨论】:

  • 嗯,这似乎很容易 - 看看它是否被翻译成 SQL,而不是在一秒钟内被评估客户端。
  • 这样的代码根本没有理由。这会使每个查询都带有转换。 EF Core 已经使用值转换器处理了这种情况。此外,即使是深度嵌套的比较也不需要 - Enum.Parse 也会这样做
  • @PanagiotisKanavos,垃圾是什么意思?你读过原始问题吗?如何减少有效载荷?
  • 首先,字符串到枚举的转换已经可用。即使不是这样,您也可以使用Enum.ParseEnum.TryParse 将字符串解析为枚举
  • @PanagiotisKanavos,字符串将被传输到客户端 - 这是 OP 想要省略的。再次阅读问题。
猜你喜欢
  • 2018-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多