打造轻量级的实体类数据容器

By admin in bet体育在线网址手机版 on 2019年1月3日

   
这里有两个至关首要词:轻量级实体类数据容器,还有一个诡秘的根本词:通用。那个名词之间有哪些关联呢?

[来自写字的玩意:我的连年有情人石同学,如今投入了一家显赫日元资本,作为一个新晋90后投资人有诸多感触,写了这一篇现场纪录型的感想,当一个断面看看这一个时代还挺有意思。小说在下边,我的话在文后]

   
一般的话,操作实体类往往伴随着一个实体类集合,而这个聚集就是实体类的容器,在此处自己将“容器”视作一个比集合更普遍的概念,例如Entity
Framework做了一个重量级的器皿ObjectContext,用于与作为靶子(这多少个目的为
EDM 中定义的实业类型的实例)的数目举行交互。

一.

   
实体类与容器没有早晚关系,例如DataSet也是一个容器,它存储并操作DataTable,而DataTable也得以用作是各个单元格数据的容器…

出生东京(Tokyo),给一部分北漂的老友们发微信,说我来首都工作了。

   
可是,那些“数据容器”如故显示相比较重量级,里面有太多要互相的子对象,为此我在PDF.NET(PWMIS数据开发框架)中定义了一个充足轻量级的实业数据容器,它存储数据的条件很粗略,就是一个object[][],外加一个应和的字段名称数组,其余诸如表的元素据等消息都没有存储,也就是下面程序中的3个民用对象:

『约起!』

 

90%的人率先句话回复那一个。

    /// <summary>
    /// 实体数据容器
    /// </summary>
    public class EntityContainer
    {
        private string[] fieldNames;
        private List<object[]> Values;
        private object[] currValue;

『我也不在XX(老东家)干了。』

    }

70%的人第二句回复这多少个。

 

『刚到一家创业集团,做XX的。』

实业容器接收一个DataReader对象,将其中的数据读入Values
数组,下边是相应的点子代码:

60%的人第三句话回复这么些。

 

国都群众竟这么积极响应李总号召,把自身吓的合不拢腿,心想,日本首都当成来对了。

        /// <summary>
        /// 执行DataReader查询,并将查询结果缓存
        /// </summary>
        /// <param name=”reader”>数据阅读器</param>
        /// <returns>结果行数</returns>
        public int Execute(IDataReader reader)
        {
            List<object[]> list = new List<object[]>();
            using (reader)
            {
                if (reader.Read())
                {
                    int fcount = reader.FieldCount;
                    fieldNames = new string[fcount];
                    object[] values = null;

来以前我就从一个房东网站上租下一间房,统一装修,app签约,白条付款,客服说,现在租房得抢,你要着眼于了就先准备好钱,等房源在网上放出去,什么人付钱快就归什么人。吓得自身老老实实守着时光去刷app,比抢红包都鼓足,怕wifi不稳定还一向用4G,房子也没实地走走就急迅付了款。当然,我真正也直接相信创业集团的劳务,说到底在这多少个阶段,他们或者坚信自己有『专注把用户体验做到极致』的心绪

                    for (int i = 0; i < fcount; i++)
                        fieldNames[i] = reader.GetName(i);

房屋在双井,朋友截个图给自己看,说在百度搜“双井”,联想词里就有性都:『日本首都说猥琐男多,中关村笑了;首尔说是性都,双井笑了。』朋友说,你是不是有老鼠掉米缸的感觉到?欲哭无泪,只可以庆幸自己没租去苹果社区,依然多亏网站的租房管家非常婉转的规劝:『那一个小区部分太艺术』。

                    do
                    {
                        values = new object[fcount];
                        reader.GetValues(values);
                        list.Add(values);
                    } while (reader.Read());

网站的管家已经等在小区门口,执意帮自己拎着箱子。在香江时的一位师兄告诉自己,对于生活,他信奉的就是『把一天装进一个包里,把一年装进一个箱子里』,我对这句颇有逼格的话深以为然,多少个城市搬来搬去,就只拎着一件行李。小区里各家送外卖送生鲜送便利商品的电动车不时呼啸而过,统一佩戴,派头十足,电梯间分众的大楼广告滚动播发某二手车交易网站、某代驾app和某旅游网站的广告。
想起在迪拜时,一位广告代理公司的仇人跟自己吐槽,说现在地铁广告贵得离谱,也就刚融了钱的创业公司才能买得起

                }
            }
            this.Values = list;
            return list.Count;
        }

管家带自己简单参观完房间,热情的唤起我,很快网站会打电话回访,满足的话记得给个好评哟。合租的哥们也闻声来通告。

次第中利用 reader.GetValues(values)
方法,它不用对每列举行多少读取,所以数据读取的频率较高。

『哥们儿你刚毕业?做哪行的?』

现今数量存放进去了,咋样行使啊?为了成功通用,具体每个数据的施用或者提交使用者自己去处理啊,所以利用一个委托方法来拍卖:

『对,』我说,『搞风险投资的,投资创业集团。』

 

『哟,90后投资人啊!托你们的福,洗了一个月的车,每回注册一家,全都一块钱。

        /// <summary>
        /// 采纳自定义的炫耀形式,将数据容器中的数据映射到指定的类中 
        /// </summary>
        /// <typeparam name=”TResult”>结果类型</typeparam>
        /// <param name=”fun”>处理数量的主意</param>
        /// <returns></returns>
        public IEnumerable<TResult> Map<TResult>(Func<TResult> fun) where TResult : class, new()
        {
            if (this.Values != null && this.fieldNames != null)
            {
                foreach (object[] itemValues in this.Values)
                {
                    TResult t = new TResult();
                    this.currValue = itemValues;
                    fun(t);
                    yield return t;
                }
            }
            else
            {
                throw new Exception(“EntityContainer 错误,调用该情势前请先调用Execute 方法。”);
            }
        }

自我陪着他哈哈大笑

下面是该情势的使用示例:

『算我请的,你不用客气』

 

二.

           
EntityContainer ec = new EntityContainer(q, db);
            ec.Execute();
            var mapUser2= ec.Map<User>((e) => 
            {
                e.Age = ec.GetItemValue<int>(“Age”);
                e.ID = ec.GetItemValue<int>(“ID”);
                e.Name = ec.GetItemValue<string>(“name”);//不区分轻重缓急写
                return e; 
            }
            ).ToList ();

其实,不太喜欢被贴个90后投资人的竹签,令人以为自家只是看社交和二次元的,所以就也蓄起了胡须。

 除了可以动用 GetItemValue<T>(string fieldName)
方法来得到迭代的此时此刻行的某列数据外,也可以使用 GetItemValue<T>(int
fieldIndex) 方法。

这两年,越来越多的同龄人成为投资人,基本各家机构都有个当家小鲜肉,要是这一个机关只希望招来的年轻人去投什么『90后的东西』,他们快速就要失望的发现,这群小鲜肉对所谓90后实际也什么都不懂(当然至少比申银万国这篇讲非主流的告知靠谱),然后精晓到,90后的共性就是没有共性。

除此以外,还提供了一个将数据映射到PDF.NET实体类的办法,下边是艺术的定义:

自然,也有一种走粗犷路线的心心相印机构,他们并不期待自己挑项目标见地挣钱,就像牛市里买股票,反正也是闭着双眼投,招些90后小伙子精力旺盛还省了众多工薪。

 

少壮投资人所能看的,绝非仅是『90后的东西』,时代变迁太快,伴随网络长大的90后一代人,自然更便于驾驭这多少个时代。实习时的老大有次对本人感慨:小石,时代真正变了。90年代我在美利哥读书,这时候一张电影票5美金,而且进了影院不查票,各类厅随你呆,看哪场都没人管,中国留学生结伴去,一泡就是一整天。回到国内,不促销的电影票基本要10加元,比美利哥还贵,网上的盗版又很猖狂,我当下就以为,这一个行业怎么可能发展好吧?但就在上个月,中国市场电影票房首次超越美利坚合众国,我很受惊,固然实际就是这么,我如故无法精通。

        /// <summary>
        /// 将数据从容器中映射到实体中
        /// </summary>
        /// <typeparam name=”T”></typeparam>
        /// <returns></returns>
        public IEnumerable<T> Map<T>() where T : EntityBase{

实际就是,辛勤和智慧或许都难征服代际的反差,也无从令人从那二种原始的沉思启发式里跳脱出来。

             //具体代码略

三.

        }

胸怀坦荡的说,作为90后,我在出道前仍然很怂的,觉得投资人全是人精,这种全方位碾压自己的老油条。

下边的测试例子中,User类是一个实体类,所以可以用下面的不二法门从来获取该类的实例对象集合:

但实习不久本身就发现,固然到这一个行当,自己也还算是聪明人,时不时还会被一些投资人和创业者蠢的目瞪口呆。前一年摘了果子的PE,生意做不下来的小业主,互联网爆发新贵,没兴趣继承家业的二代们,还有各路莫名其妙发了家的人,纷纷投身大潮,对创业者挥舞着自家的钞票。他们中的不少人都是自己孩子拉扯申请的apple
ID,30%的人不会翻墙,10%的人每逢刷屏就赞不绝口社会化营销,5%的人还以为比特币无比好奇。最近的饭局上,带着祥和投了天使的青年人,远比带着貌丽人秘书的逼格高,莫非就是风传中的Smart
is the new sexy?

 

世纪初这场互联网泡沫中全身而退的安迪(安迪(Andy))·Keith勒在记忆录《华尔街的肉》里说,作为行业的新娘,你首先要了然自己从事的骨子里是娱乐业。做VC这行,其实很惨痛,创业者坐在面前,你明知道这事情不靠谱,还不能够太打击他,这么多创业活动聚会天天搞,你明知道是浪费时间,仍然得去凑热闹。

           
EntityContainer ec = new EntityContainer(q, db);
            ec.Execute();
            var mapUser1 = ec.Map<User>().ToList ();

四.

在Map方法中,可以映射出任意PDF.NET实体类,或者其他自定义的POCO实体类,而且尚未映射次数限制。看到此间聪明的您也许要问了,下边的例子可以映射User之外的实业吗?答案是一点一滴能够!

拉着一位对互联网不怎么发烧的恋人去了传说中的中关村创业大街。这条街,宽约十米,长约百米,路边卖互联网煎饼的店小哥在收银机边无聊的刷起初机,正午的太阳让整条街没什么生气。

先看一个例证,大家假如系统中还存在一个实体类
Group,我们应用PDF.NET的OQL表明式写一个辅助六个实体连接查询的话语:

躲进3W里喝了一杯50块的管辖同款咖啡,尽管很甜,全是泡沫。杯子上写是“生命不息,折腾不止”,可能摆在桌子上,会让人特来劲。

 

出自写字的玩意: OK,下方是自家个人的增补。

创业潮福利

两年前和一个新加坡创业者聊天的时候,他分外兴奋地讲近来向上突出,都“可以在地铁站放广告了”,俨然将其视为公司上轨道的印证。当时大家还钻探了下她不行时髦项目在地铁站放广告有多大转换率。什么人知道时代一变,现在地铁广告快成创业公司们融资后烧钱的专利了。

关于创业潮福利,一年前曾有篇流传挺广的《I Have Apps Doing Everything
For
Me》
,讲述作者搬到马尼拉后用App完成所有事的经历。现在看来上海居民不仅可以拥有相同体会,还出演自带大量补贴福利(补贴之盛连纯为赚补贴的刷单都是家事了,挺有意思的),偶尔还有走在旅途被人拦下来死活要送体验卷的遭逢。

当然,文中涉及“情怀”和“1元洗车”等都会渐渐消散,但起码在这一段时期里,作为普通人的您简直活在一个人们贴心事事便宜的嘉年华里。

2.  90后视野

笔者的这么些可能没有提,国内影视票不让利卖10日币,但打完折/团购后不到5日元还附赠爆米花汽水卷(又一种便利)。

文中那句“难战胜代际的区别”
在上一版中已经被删了,后来又被加了回来。的确是老大残暴的真心话。理论上,让一个大人抱着“年轻人喜爱”的眼光看时辰代或者EXO的视频十五遍,肯定能分析出有些原因一套逻辑,甚至以为自己也毫无代沟地喜爱上了。但这无法缓解一始发考虑方法和观念就完全两样的题目。

这篇神奇的非主流报告看成知情90/95后的参考可能脑洞太大,但借此让青少年反过来推断中年人眼中的“年轻人”还挺有价值的。

3. 圈子&安迪·凯斯勒 & 泡沫

作为一个出校门不久的后生兼科技爱好者,行业蠢人那段比较理想化。不同人来自然是为着回报,不是因为领悟如故喜欢。就像明年青海人涌到香港(Hong Kong)买房,“是为着炒钱不是因为香港(香港)”
(这是即时香岛中介对自家说的话)一样。

自己在很早前某篇荐书中推荐过安迪(Andy)·Keith勒。他还写过本介绍自己离开投行后当做投资人感悟的《慧眼挑金》(繁中版),虽然例子和一些计量方法都相比较过时——当时有个正在崛起的安徽公司叫台积电,但经过很有意思。实际上互联网业者看正文中涉及的那本《华尔街的肉》可能会有点尴尬,里面被作者点名讽刺的某位人员前段时间已经擢升为女皇了。

最后一段的咖啡在本文前后六个版本中(此版本算最好的)都尚未被剔除。好吧,的确很甜,全是泡沫,一杯拿情怀卖到50块。诚如常被国内创业者援引的马云所说,“大多数人都死在明天夜晚”,但是你既然都早已决定要走这条路了,上午喝一杯咖啡可能可以撑久一点,边喝边看“生命不息,折腾不止“
可能可以撑更久一点。信者没准得救呢。

4.其他

随笔标题是自我改的,题图是石同学自己壁画的照片,欢迎各位直接发邮件到安东尼(Anthony)shih@outlook.com和他交换。

OQL q=OQL.From(user)
         .InnerJoin(group) //连接Group实体
         .On(user.GroupID,group.ID)
         .Select(user.ID,user.Name,group.GroupName) //拔取指定的字段

下边就可以映射出五个实体集合了:

 

           
EntityContainer ec = new EntityContainer(q, db);
            ec.Execute(); //可以简单此行调用
            var mapUser1 = ec.Map<User>().ToList ();
            var mapGroup1=
ec.Map<Group>().ToList();

假定觉得这样分别使用五个实体对象集合(
user和group)相比较费力,那么再自定义一个“用户单位”类即可:

 

 class UserGroup 
{
    int ID{get;set;}
    string Name{get;set;}
    string GroupName{get;set;}
}

从此将来,可以像下面这样来行使数据:

 

            EntityContainer ec = new EntityContainer(q, db);
            //ec.Execute();//能够简单此行调用

            var mapEntity= ec.Map<UserGroup>((e) => 
            {
                e.GroupName = ec.GetItemValue<int>(“GroupName”);
                e.ID = ec.GetItemValue<int>(“ID”);
                e.Name = ec.GetItemValue<string>(“name”);//不区分轻重缓急写
/*
//或者应用索引的办法,但不可能不旗帜显明地点OQL表明式Select方法里面属性的次第 
                e.GroupName = ec.GetItemValue<strng>(2);
                e.ID = ec.GetItemValue<int>(0);
                e.Name = ec.GetItemValue<string>(1);

*/
                return e; 
            }
            ).ToList ();

  

上边的写法没有LINQ那么完美,人家LINQ是近水楼台先得月,MS自家的幼苗,能够借助“编译器语法糖”来写出漂亮的LINQ程序,但我们的这多少个实现从规律上说特别轻快,在不少不法的ORM框架中,真正协助了实体类的多表连接查询!

 

有关OQL的多实体连接查询仅在PDF.NET框架V4.1未来版本匡助,该意义作为框架的一项关键功用扩张,已经在商贸类型中起始应用,感兴趣的爱侣可以协同研商。

下边的代码是实在项目中的一段代码,大家来看望完整的调用模式:

 

public string GetTradeTypeID(string foundAccount,string jjdm,string type)
        {
            /*执行下边的询问将拔取如下类似的SQL:
             select distinct a.tradetype tradetypeid from wft_customerfundtrade a
                 left join wft_customerfundtradedetails b on a.tradetype =b.tradetypeid
                      where   (a.fundaccount =’1185919705′  and a.jjdm =’KF0003’)
                         and ( b.tradetype=’定投’ or b.tradetype=’基金转换的记帐’)
             * 
             */
            WFT_CustomerFundTrade trade = new WFT_CustomerFundTrade() { FundAccount = foundAccount, JJDM = jjdm };
            WFT_CustomerFundTradeDetails detail = new WFT_CustomerFundTradeDetails() { TradeType = type };
            OQLCompare cmpAll = new OQLCompare(trade, detail);

            OQL q = OQL.From(trade)
                .LeftJoin(detail).On(trade.TradeType, detail.TradeTypeId)
                .Select(trade.TradeType)
                .Where(
                        (cmpAll.Comparer(trade.FundAccount) & cmpAll.Comparer(trade.JJDM)) &
                        (cmpAll.Comparer(detail.TradeType) | cmpAll.Comparer(detail.TradeType, “=”, “基金转换的记帐”))
                )
                .END;

            q.Distinct = true;

            EntityContainer container = new EntityContainer(q);
            var result = container.Map<WFT_CustomerFundTrade>().ToList();
            if (result.Count == 0)
                return “”;
            else
                return result[0].TradeType;
}

由这一个事例能够观望,PDF.NET的ORM框架中的实体对象查询语言–OQL,已经足以完成很复杂的询问了,包括多实体类关联查询。

 

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 mobile.365-838.com 版权所有