Entity Framework 6.0已经支持枚举的操作了,本文讲解一下如何通过枚举将位运算应用到Entity Framework中。
常用的位运算有与(&
),或(|
),非(~
),另外还有异或(^
),左移(<<
)和右移(>>
)。
下面我们通过例子完成本文。
首先定义一个支付类型的枚举PayType,注意带有位标记Flags。
[Flags] public enum PayType { None = 0, /// <summary> /// 积分 /// </summary> [Description("积分")] Points = 1 << 0, /// <summary> /// 信用卡 /// </summary> [Description("信用卡")] CreditCard = 1 << 1, /// <summary> /// 借记卡 /// </summary> [Description("借记卡")] DebitCard = 1 << 2, /// <summary> /// 支付宝 /// </summary> [Description("支付宝")] Alipay = 1 << 3, /// <summary> /// 微信 /// </summary> [Description("微信")] WebChat = 1 << 4, /// <summary> /// 百度钱包 /// </summary> [Description("百度钱包")] BaiDu = 1 << 5 }
也可以定义成如下形式
[Flags] public enum PayType { None = 0x0000, /// <summary> /// 积分 /// </summary> [Description("积分")] Points = 0x0001, /// <summary> /// 信用卡 /// </summary> [Description("信用卡")] CreditCard = 0x0002, /// <summary> /// 借记卡 /// </summary> [Description("借记卡")] DebitCard = 0x0004, /// <summary> /// 支付宝 /// </summary> [Description("支付宝")] Alipay = 0x0008, /// <summary> /// 微信 /// </summary> [Description("微信")] WebChat = 0x0010, /// <summary> /// 百度钱包 /// </summary> [Description("百度钱包")] BaiDu = 0x0020 }
下面为一些常见的操作,都有注释和输出结果:
//支付类型为 积分和信用卡 PayType payType = PayType.Points | PayType.CreditCard; //输出 Points, CreditCard Console.WriteLine(payType); //从积分和信用卡类型中去除信用卡类型 payType = payType & ~PayType.CreditCard; //输出 Points Console.WriteLine(payType); //判断是否使用了支付宝类型 var useAlipay = ((payType | PayType.Alipay) & PayType.Alipay) != 0; //输出 True Console.WriteLine(useAlipay);
下面开始介绍如何在EF中的操作,主要包括添加和查询。
首先使用EF添加以下数据:
//支付类型为 积分和支付宝 ctx.PayRecords.Add(new PayRecords { PayType = PayType.Points | PayType.Alipay, PayDate = DateTime.Now, PayCash = 180.5m }); //支付类型为 微信支付 ctx.PayRecords.Add(new PayRecords { PayType = PayType.WebChat, PayDate = DateTime.Now, PayCash = 50m }); //支付类型为 积分和信用卡 ctx.PayRecords.Add(new PayRecords { PayType = PayType.Points | PayType.CreditCard, PayDate = DateTime.Now, PayCash = 89.1m });
下面演示三种查询:
//所有的支付记录 var allPayRecords = ctx.PayRecords.ToList(); //只使用微信支付的记录 var onlyWebChatPayRecords = ctx.PayRecords.Where(t => t.PayType == PayType.WebChat).ToList(); //包含积分支付的记录 var pointsPayRecords = ctx.PayRecords.Where(t => (t.PayType & PayType.Points) != 0).ToList(); //包含积分或微信支付的记录 var pointsOrWebChatPayRecords = ctx.PayRecords.Where(t => (t.PayType & (PayType.Points | PayType.WebChat)) != 0).ToList();
输出结果如下图所示:
相对应的SQL如下:
最后再介绍一下更新,刚刚支付的结果中有一条的支付类型是积分和支付宝,如果要更新为只使用支付宝,或使用积分和借记卡,这又该如何操作呢?这个非常简单,直接赋值就可以了。
var updateRecord = ctx.PayRecords.Find(1); //支付类型更新为只使用支付宝 updateRecord.PayType = PayType.Points; //支付类型更新为使用积分和借记卡 updateRecord.PayType = PayType.Points | PayType.DebitCard;
你好,想请教你一个关于EF的问题。
我想使用EF操作mysql。
想问一下怎么在EF中手动设置connectionstring和provider。我不想用常规的xml进行配置。
如果可以,回复到我的信箱,admin@webipp.com
最后推荐你一个p2p的梯子软件,lantern。github上的开源golang项目,我在上海用这个看视频都没问题。速度不错
已回复到你的邮箱