EntityFrameWork实现部分字段获取和修改(含源码)

  EntityFrameWork类库,是微软推出的ORM组件,它是基于Ado.Net的,个人感觉还是非常 好用的。以下介绍的2个功能点分别是部分字段更新和获取

 

  解决部分字段Update。本方案采用仓储模式

  步骤1:定义接口,实现仓库基类

  步骤2:实现接口

   步骤3:定义DbContext对象

  步骤4:创建Access对象

  步骤5:调用

    using (TestDbContext dbContext = new TestDbContext())
    {
        baunitAccess dbAccess = new baunitAccess(dbContext);

        //使用部分更新(不推荐,10000条数据时,非常慢)
        List<baunitBillModel> listModel = new List<baunitBillModel>();
        listModel.Add(new baunitBillModel() { UnitCode = "U001", UnitName = "U0011" });
        listModel.Add(new baunitBillModel() { UnitCode = "U002", UnitName = "U0022" });
        listModel.Add(new baunitBillModel() { UnitCode = "U003", UnitName = "U0033" });
        listModel.Add(new baunitBillModel() { UnitCode = "U004", UnitName = "U0044" });
        foreach (baunitBillModel pModel in listModel)
        {
            ba_unit pEntity = pModel.ToEntity();
            dbAccess.PartialUpdateNew(pEntity, pModel.UpdateColumnNames);
        }
        dbAccess.NoCheckSaveChanges();

        ////使用EF扩展(推荐)
        //dbContext.ba_unit
        //    .Where(c => c.UnitCode == "U001")
        //    .Update(c => new ba_unit()
        //    {
        //        UnitName = "件2"
        //    });
        //dbAccess.NoCheckSaveChanges();
    }  
   是不是so easy!!!

   下面再介绍另一个实用的功能,如果更新时,我们能够动态的记录类中哪些属性有变化,只将有变化的属性作为待更新字即可,实现起来也不复杂。代码如下

  看调用的代码中,下面这个变量就是存储哪些属性有值变化的,是不是也很简单?!!!

  pModel.UpdateColumnNames

  不过,在这里要强调下,使用部分字段更新方式,在性能上仍然存在缺陷。原因:在数据量多的时候,每次Update时,都要在内存中循环找数据匹配,提交数据多的时候,不推荐使用

 推荐使用EF扩展类库,就是上面代码中第2种方案,这种方式是最接近Ado.Net方式

 

解决部分字段获取

  下面介绍几种方法,只返回部分字段,就是使用Linq语法中的Select关键字

  已知条件:创建一个SqlServer数据库(其他类型数据库均可),再创建ba_unit表,字段包括:UnitCode,UnitName,SortNo,Status

  代码如下所示

    using (TestDbContext dbContext = new TestDbContext())
    {
        //(OK)方法1
        //微软原汁原味的写法,推荐使用
        var listUnitCode = dbContext.ba_unit.Select(c => c.UnitCode).ToList();
        var listP1 = dbContext.ba_unit.Select(c => new { c.UnitCode, c.UnitName }).ToList();
        System.Console.WriteLine("方法1,返回个数:" + listP1.Count());

        //(OK)方法2
        //也是微软本身提供的方法,要求:Select中的类,不能是Db表的映射类,即:Select(c => new ba_unit())时会报错
        IQueryable<ba_unit> queryUnit2 = dbContext.ba_unit.AsQueryable();
        List<baunitBillModel> listUnit2 = queryUnit2.Select(c => new baunitBillModel()
        {
            UnitCode = c.UnitCode,
            UnitName = c.UnitName
        }).ToList();
        System.Console.WriteLine("方法2,返回个数:" + listUnit2.Count());

        //(OK)方法3
        //此方法看着比较另类,但也是能实现.需第三方类支持(最下面已提供下载)
        //参考地址:http://blog.csdn.net/shiyaru1314/article/details/50473905
        List<ba_unit> listUnit3 = new List<ba_unit>();
        IQueryable<ba_unit> queryUnit3 = dbContext.ba_unit.AsQueryable();
        var listP3 = queryUnit3.Where(c => c.UnitCode == "U001").Select("new (UnitCode, UnitName)").AsQueryable();
        foreach (dynamic p in listP3)
        {
            string unitCode = p.UnitCode;
            string unitName = p.UnitName;

            listUnit3.Add(new ba_unit() { UnitCode = unitCode, UnitName = unitName });
        }
        System.Console.WriteLine("方法3,返回个数:" + listUnit3.Count());

        //(OK)方法4
        //此方法是在查找资料过程中找到的,实现的Linq语法拼入Sql语句的方式,对于习惯写Sql的童鞋可以使用
        var listUnit4 = dbContext.ba_unit.Where("SortNo = 1").OrderBy("UnitCode");
        System.Console.WriteLine("方法4,返回个数:" + listUnit4.Count());

        //(NO)方法5
        //此方法和方法4一样,区别是参数化查询(目前此方法有问题,没有拼入条件)
        var listUnit5 = dbContext.ba_unit.Where("UnitCode = @UnitCode", new object[] { "U001" }).OrderBy("UnitCode");
        System.Console.WriteLine("方法5,返回个数:" + listUnit5.Count());

        //方法6
        //这个方法,我觉得也很好用,就一并展示出来,好处是避免创建过多的Model类
        //参考地址:http://www.cnblogs.com/sword-successful/p/3318540.html
        DataTable dtUnit6 = new DataTable();
        dtUnit6.Columns.Add("UnitCode", typeof(string));
        dtUnit6.Columns.Add("UnitName", typeof(string));
        dtUnit6.Rows.Add(new object[] { "U001", "U001Name" });
        dtUnit6.Rows.Add(new object[] { "U002", "U002Name" });
        dtUnit6.Rows.Add(new object[] { "U003", "U003Name" });
        var listUnit6 = from p in dtUnit6.AsEnumerable()
                    select new
                    {
                        UnitCode = p["UnitCode"] as string,
                        UnitName = p["UnitName"] as string
                    };
        System.Console.WriteLine("方法6,返回个数:" + listUnit6.Count());
        foreach (var p in listUnit6)
        {
            System.Console.WriteLine(string.Format("    子项->UnitCode:{0},UnitName:{1}", p.UnitCode, p.UnitName));
        }
    }

 

源码下载方式

1,关注微信公众号:小特工作室(也可直接扫描签名处二维码)

2,发送:示例4009

即可下载

  

时间: 2024-10-24 05:06:47

EntityFrameWork实现部分字段获取和修改(含源码)的相关文章

《深入解析Android 虚拟机》——第1章 获取并编译Android源码 1.1获取Android源码

第1章 获取并编译Android源码 在本章中,将详细讲解获取并编译Android源码的基本知识,介绍各个目录中主要文件的功能,为读者步入本书后面知识的学习打下基础. 1.1 获取Android源码 要想研究Android系统的源码,需要先获取其源码.目前市面上主流的操作系统有Windows.Linux.Mac OS的操作系统,由于Mac OS源自于Linux系统,因此本书将讲解分别在Windows系统和Linux系统中获取Android源码的知识. 1.1.1 在Linux系统获取Androi

如何修改spark源码,更改程序名称。

问题描述 想修改spark源码,想把程序的名称改为其他的,而不是spark,这个怎么修改呢?源码中有用到APPLICATION_NAMEpublicstaticfinalStringAPPLICATION_NAME="APPLICATION_NAME";在default.java中,这个APPLICATION_NAME,程序是如何自动获取"spark"这个名称的,想修改又如何修改.大神们帮帮忙啊

修改VCL源码实现自定义输入对话框

通过修改VCL源码实现自定义输入对话框 在BCB中有两个函数可以实现输入对话框:InputBox和InputQuery,其实InputBox也是调用了InputQuery,这个函数有几个缺点: (1).输入对话框上的按钮是英文的. (2).不能实现星号密码的效果. 但在实际编程中经常会遇到这样的问题.全是中文的界面和提示,可是在输入对话框中却是英文的按钮,显的有些不协调,而且有时在Win2k下做的程序,换在Win98下的时候,输入对话框中的提示会显示不完整.通常在Form中可以通过更改默认字体为

模板-有没有会修改cms源码 我想仿一个网站 但人家用的是dedecms谁能给我转成phpcms?

问题描述 有没有会修改cms源码 我想仿一个网站 但人家用的是dedecms谁能给我转成phpcms? 就是这个破站http://www.sellbang.com 他也是仿的别人的 但是模板我比较喜欢 但我只会phpCMS 不想再花时间研究dedecms 谁有现成的方法或软件给下呗 把它转成phpcms 解决方案 你会phpcms,dede更容易啊,

这是一款仅针对「中国网民」的勒索软件(含源码下载)

在黑客的众多牟利手段当中,勒索软件可能是最普遍的一种.这种恶意软件通常会通过受感染的邮件附件.被篡改的网站或网页广告散布.勒索软件会对用户电脑上的文件进行加密,除非受害者交付特定数额的赎金,否则受影响的文件将会一直处于不可用的状态. 最近安全研究人员发现了一种新型恶意勒索软件cuteRansomware,而该恶意勒索软件正在使用谷歌文档工具Google Doc存储受害者的信息,更有趣的事情是,该恶意勒索软件源码在几个月前出现在了GitHub上,该项目名为my-Little-Ransomware,

dao-MyBatis-generator-core 生成的Dao 怎么自定义名字 (或者手动修改哪些源码可以实现)

问题描述 MyBatis-generator-core 生成的Dao 怎么自定义名字 (或者手动修改哪些源码可以实现) generatorConfig.xml 生成后 com.lahand.dao下的BlackCardMapper类,怎么修改配置文件,让它生成 IBlackCardDa这样的名字,就是可以自定义生成的文件的名字 解决方案 这个好像是不行的.要手动去改.因为生成是按照你命名的那个entity类名的后面直接加上mapper的 解决方案二: 修改里面的generatorConfig.x

向了解VLC开发的求教:如何修改VLC源码中UDP包长度?

问题描述 向了解VLC开发的求教:如何修改VLC源码中UDP包长度? 大家好 我在官网上下载了VLC的源代码,版本vlc-2.2.0.我现在在服务器端通过VLC向客户端发送本地视频文件并播放该视频,客户端接收数据并通过VLC播放视频,!他们之间通过UDP的方式传输,现在想要更改服务器端发出的UDP包的长度,使之变小,请问在VLC源代码哪里更改,看见源代码里边那么多的模块,看了两天实在找不到头绪,请高手指教,不胜感激! 解决方案 http://blog.csdn.net/lvmaker/artic

nginx支持先下载完数据再给客户端吗?最近修改upstream源码造成内存升高不知怎么解决了

问题描述 nginx支持先下载完数据再给客户端吗?最近修改upstream源码造成内存升高不知怎么解决了 nginx原本就能先下载完整数据,再发送给客户端吗?该怎么做? 我最近动了nginx的upstream模块,动完之后发现内存泄露了,我基本上都是用的nginx本来开辟的空间和数据或者在pool上开辟可是内存还是在升高,不明白我哪里操作不当了,谁能给指点指点吗?谢谢

请问有谁可以帮助我通过HttpWebRequest能获取此网址的源码或者超时?或者其它方法?

问题描述 请问有谁可以帮助我通过HttpWebRequest能获取此网址的源码或者超时?或者其它方法?http://blog.itpub.net/41594/viewspace-50539/正如大家看到的一样,内存了满了.这个网址设置超时也无效.也不发生异常.哪个朋友有解决办法?代码片段varreq=WebRequest.Create(uri)asHttpWebRequest;req.KeepAlive=false;req.ProtocolVersion=HttpVersion.Version1