FreeSql icon indicating copy to clipboard operation
FreeSql copied to clipboard

mysql中enum和set数据类型的支持

Open jackletter opened this issue 2 years ago • 3 comments

enum:

freesql中现有功能已满足需求,不过是否考虑将从c#中的枚举默认映射到mysql的int,而不是mysql的enum,如果映射到mysql的int,那么兼容性就更强一点。

set:

mysql中的set应该和c#中的位枚举对应,位枚举在写入时需要移除ToString()中的空格或者转成int再插入,否则mysql会报错。 另外,set类型的查询考虑提供c#扩展方法支持。

关于mysql中的enum和set的使用,我总结了一篇文章: 《mysql:列类型之enum、set》

jackletter avatar Mar 29 '22 10:03 jackletter

测试代码:

实体定义

 public enum EnumTest
  {
      A, B, C
  }

  [Flags]
  public enum SetTest
  {
      A = 1, B = 2, C = 4
  }

  public class TestTable
  {
      [Column(IsPrimary = true, IsIdentity = true)]
      public int Id { get; set; }

      public EnumTest ColEnumTest { get; set; }

      public SetTest ColSetTest { get; set; }
  }

调用

//插入
//insert into TestTable(ColEnumTest,ColSetTest) values('B','A,B');
//insert into TestTable(ColEnumTest,ColSetTest) values(1,3);
Orm.Insert<TestTable>().AppendData(new TestTable
{
    ColEnumTest = EnumTest.B,
    ColSetTest = SetTest.A | SetTest.B
}).ToSql();

//查询 扩展方法 contains
//select * from TestTable t where FIND_IN_SET('A',t.ColSetTest)>0
//select * from TestTable t where t.ColSetTest&1
Orm.Select<TestTable>().Where(i => i.ColSetTest.Contains(SetTest.A)).ToSql();

//select * from TestTable t where FIND_IN_SET('A',t.ColSetTest)>0 and FIND_IN_SET('C',t.ColSetTest)>0
//select * from TestTable t where t.ColSetTest&1 and t.ColSetTest&4
var set = SetTest.A | SetTest.C;
Orm.Select<TestTable>().Where(i => i.ColSetTest.Contains(set)).ToSql();

jackletter avatar Mar 29 '22 11:03 jackletter

我在ToList 转换enum 的名称时候会报错。 .ToList(x=>new Dto{ name=Enum.GetName(typeof(XXXEnum),x.nameKey) }) (nameKey是name对应的枚举值 int) 现在是在外部实现 result.ForEach(x=>x.name=Enum.GetName(typeof(XXXEnum),x.nameKey));

zhaoxingyu999 avatar May 07 '22 03:05 zhaoxingyu999

我在ToList 转换enum 的名称时候会报错。 .ToList(x=>new Dto{ name=Enum.GetName(typeof(XXXEnum),x.nameKey) }) (nameKey是name对应的枚举值 int) 现在是在外部实现 result.ForEach(x=>x.name=Enum.GetName(typeof(XXXEnum),x.nameKey));

Enum.GetName不支持解析表达式树,其实 mysql enum 可以直接用枚举类型映射的

2881099 avatar May 07 '22 04:05 2881099