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项目,我在上海用这个看视频都没问题。速度不错
已回复到你的邮箱