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();

输出结果如下图所示:

按位运算在Entity Framework中的应用-程序旅途

相对应的SQL如下:

按位运算在Entity Framework中的应用-程序旅途

最后再介绍一下更新,刚刚支付的结果中有一条的支付类型是积分和支付宝,如果要更新为只使用支付宝,或使用积分和借记卡,这又该如何操作呢?这个非常简单,直接赋值就可以了。

                var updateRecord = ctx.PayRecords.Find(1);

                //支付类型更新为只使用支付宝
                updateRecord.PayType = PayType.Points;

                //支付类型更新为使用积分和借记卡
                updateRecord.PayType = PayType.Points | PayType.DebitCard;