FreeSql
FreeSql copied to clipboard
mysql中enum和set数据类型的支持
enum:
freesql中现有功能已满足需求,不过是否考虑将从c#中的枚举默认映射到mysql的int,而不是mysql的enum,如果映射到mysql的int,那么兼容性就更强一点。
set:
mysql中的set应该和c#中的位枚举对应,位枚举在写入时需要移除ToString()中的空格或者转成int再插入,否则mysql会报错。 另外,set类型的查询考虑提供c#扩展方法支持。
关于mysql中的enum和set的使用,我总结了一篇文章: 《mysql:列类型之enum、set》
测试代码:
实体定义
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();
我在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));
我在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 可以直接用枚举类型映射的