当前位置:必发365电子游戏 > 编程 > 还是使用了双重否定,通过EF的上下文把SQL语句发到数据库
还是使用了双重否定,通过EF的上下文把SQL语句发到数据库
2019-12-19

回去目录

归来目录

在编制程序世界里,运用“否定式”不是风华正茂件好事,因为它的可读性并不高,但奇迹,为了让使用者收缩代码量,照旧选择了再一次否定,直到DefaultValue的面世,它改革了这一切,它可以为你的习性设置你想要的默许值,如bool类型私下认可值是false,而假设你期待它的暗中同意值是true,就须要用到DefaultValue那么些特点了。

在开展总计时,极其是按月进行总计,由于大家运用的大运是叁个二零一五-12-一日这种,所以在linq你无法张开拆分,你拆分了在发到SQL时也会报错,因为SQL那边更新没有要求你.net的方法,人家SQL只认本人的法子,哈哈,那也是健康的,为了消弭这一个主题材料,我们有的时候也亟需接受纯SQL,当前也是基于EF的,通过EF的上下文把SQL语句发到数据库。

这是本人IUnitOfWork代码片断

必发365电子游戏,下边是一个相比复杂的计算,按月把某部客户的某部职务拓宽求和及求总量的计算,看一下代码

   /// <summary>
    /// 工作单元
    /// 提供一个保存方法,它可以对调用层公开,为了减少连库次数
    /// </summary>
    public interface IUnitOfWork
    {
        /// <summary>
        /// 将操作提交到数据库,
        /// </summary>
        void Save();
        /// <summary>
        /// 是否不提交到数据库
        /// 默认为false,即默认为提交到数据库
        /// </summary>
        /// <returns></returns>
        bool IsNotSubmit { get; set; }
    }

    /// <summary>
    /// 工作单元
    /// 对泛型类型的支持
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface IUnitOfWork<T> : IUnitOfWork where T : class { }
       var idArr = user_FighterRepository.GetModel(i => i.ParentID == companyId).Select(i => i.UserID).ToList();
            string para= string.Join(",", idArr);
            var linq = Db.Database.SqlQuery<FighterTaskTotalDTO>(
             @"SELECT  CONVERT(CHAR(7), Day, 120) as TotalDate,
                                    COUNT(*)  as TaskCount,
                                    FighterID ,
                                    SUM(FinishedNumber) as FinishedCount
                            FROM    dbo.Count_Fighter_ByDay
                            GROUP BY FighterID ,
                                    CONVERT(CHAR(7), Day, 120)
                            HAVING  FighterID IN ("+para+")");
            return linq.ToList();

上边代码的IsNotSubmit正是贰个否定式的,那不是我们引入的,但无法,使用它,能够简化代码!它的情趣是不把纠正提交到数据库,bool类型默许是false

看你下SQL的结果

,也便是说,它暗中同意是把改良提交的数据库,怎么样,挺绕吧,呵呵。

必发365电子游戏 1

当DefaultValue出现后,就更换了那大器晚成体,你能够如此定义它了

再看一下网页上显得的结果

  public interface IUnitOfWork
    {
        /// <summary>
        /// 将操作提交到数据库,
        /// </summary>
        void Save();
        /// <summary>
        /// 是否提交到数据库
        /// 默认为true,即默认为提交到数据库
        /// </summary>
        /// <returns></returns>
        [DefaultValue(true)]
        bool IsSubmit { get; set; }

    }

必发365电子游戏 2

像这种类型的接口定义意思就很明显了,IsSubmit便是付诸,true便是付诸,false正是不交付,多清晰呀,呵呵!

最后索要潜心一点,正是你的SQL语句的每一个字段应当要有别称,如你的count(*卡塔尔国总括,供给为它起的小名,而且你的别名要和EF映射的实业性质对应!

再来看怎么收获IsSubmit的值,假使直接使用它结果还有恐怕会是false,你供给反射一下,从TypeDescriptor里获取它的值才是DefaultValue,呵呵 

回去目录

     /// <summary>
        /// 数据上下文
        /// </summary>
        class DataContext : IUnitOfWork
        {
            #region IUnitOfWork 成员

            public void Save()
            {
                throw new NotImplementedException();
            }
            /// <summary>
            /// 类不会继承接口的特性信息
            /// </summary>
            [DefaultValue(true)]
            public bool IsSubmit
            {
                get;
                set;
            }

            #endregion
        }

还是使用了双重否定,通过EF的上下文把SQL语句发到数据库。好,大家明天出口一下新闻,看看IsSubmit的值

        AttributeCollection attrColl = TypeDescriptor.GetProperties(new DataContext())["IsSubmit"].Attributes;
            DefaultValueAttribute attr = attrColl[typeof(DefaultValueAttribute)] as DefaultValueAttribute;
            bool _Value = (bool)attr.Value;
            Console.WriteLine(_Value);

结果:

必发365电子游戏 3

怎么着,现在前后相继中得以把否定式去掉了吧,呵呵 

而将以此技术利用到大家的布局中,能够那样来落到实处:(若是为IsSubmit设置了新值,就选取新值,若无安装,这就用暗中同意值,大家能够选取default(bool卡塔尔(قطر‎得到bool类型的默许值,同理default(string卡塔尔国正是字符型的)

        private bool isSubmit;
            /// <summary>
            /// 类不会继承接口的特性信息
            /// </summary>
            [DefaultValue(true)]
            public bool IsSubmit
            {
                get { return isSubmit; }
                set
                {
                    AttributeCollection attrColl = TypeDescriptor.GetProperties(this)["IsSubmit"].Attributes;
                    DefaultValueAttribute attr = attrColl[typeof(DefaultValueAttribute)] as DefaultValueAttribute;
                    if (value == default(bool))
                        isSubmit = (bool)attr.Value;
                    else
                        isSubmit = value;
                }
            }

 

回到目录

上一篇:没有了