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

即可下载

  

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

  1. THINKPHP_(8)_修改TP源码,支持基于多层关联的任一字段进行排序

    之前博文 前述博文THINKPHP_(1)_修改TP源码,支持对中文字符串按拼音进行排序,其解决的主要问题是,对于查询出的think\collection数据,按指定字段对数据进行排序,从而在页面上进 ...

  2. 微信公众平台开发-access_token获取及应用(含源码)

    微信公众平台开发-access_token获取及应用(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 很多系统中都有access_token参数,对于微信公众平台的access_to ...

  3. 微信公众平台开发2-access_token获取及应用(含源码)

    微信公众平台开发-access_token获取及应用(含源码) 很多系统中都有access_token参数,对于微信公众平台的access_token参数,微信服务器判断该公众平台所拥有的权限,允许或 ...

  4. 修改springfox-swagger源码,使example中时间格式默认为“yyyy-MM-dd HH:mm:ss”

    修改swagger源码,使example中时间格式默认为"yyyy-MM-dd HH:mm:ss" 前言 简单点说,在swagger中,怎么能针对以下vo中的java.util.D ...

  5. 微信公众平台开发-OAuth2.0网页授权(含源码)

    微信公众平台开发-OAuth2.0网页授权接口.网页授权接口详解(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 在微信开发的高级应用中,几乎都会使用到该接口,因为通过该接口,可以获 ...

  6. 微信公众平台开发-微信服务器IP接口实例(含源码)

    微信公众平台开发-access_token获取及应用(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 学习了access_token的获取及应用后,正式的使用access_token ...

  7. jQuery使用():Deferred有状态的回调列表(含源码)

    deferred的功能及其使用 deferred的实现原理及模拟源码 一.deferred的功能及其使用 deferred的底层是基于callbacks实现的,建议再熟悉callbacks的内部机制前 ...

  8. 修改spring源码重写classloader实现项目加密

      (一)操作方法和spring源码添加修改部分 事先说明:spring源码要下载好,会有修改spring的源码操作,本文和本作者所依赖的spring项目的版本是3.1.1,spring4及以上源码对 ...

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

    来自:https://yq.aliyun.com/wenji/88428 通过修改VCL源码实现自定义输入对话框 在BCB中有两个函数可以实现输入对话框:InputBox和InputQuery,其实I ...

随机推荐

  1. Java 运动模糊

    Java 运动模糊代码 想用Java 写个运动模糊的效果,无奈本人水平有限,国内也没找到资源,于是Google到了一个文档,特地分享出来! 本代码源自 http://www.jhlabs.com/ip ...

  2. 解析MYsql explain执行计划extra列输出

    EXPLAIN Extra 列信息: explain Extra列输出包含了关于mysql如何解决query的额外信息,特别是出现Using filesort 和 using temporary时,应 ...

  3. struts学习总结

    -- struts2 是在struts1和webwork基础上发展的全新框架. -- struts2解决的问题: 原始的servlet中,每需要操作一个crud的操作就要创建一个servlet,虽然后 ...

  4. shell 学习四十五天---xargs

    当 find 产生一个文件列表时,该列表提供给另一个命令有时是很有用的.案例: $touch abc.c erd.c oiy.c $ll ./erd.c ./abc.c ./oiy.c $find - ...

  5. junit4X系列--Statement

    原文出处:http://www.blogjava.net/DLevin/archive/2012/05/11/377954.html.感谢作者的无私分享. 初次用文字的方式记录读源码的过程,不知道怎么 ...

  6. linkin大话设计模式--适配器模式

    linkin大话设计模式--适配器模式 大家知道,在java中只允许单继承,但是在实际问题中往往都需要多继承,java引入了接口这一概念.(一个类可以实现多个接口) 由于接口中都是抽象方法,那么我们在 ...

  7. php中urldecode()和urlencode()起什么作用

    urlencode()函数原理就是首先把中文字符转换为十六进制,然后在每个字符前面加一个标识符%.urldecode()函数与urlencode()函数原理相反,用于解码已编码的 URL 字符串,其原 ...

  8. Regular Expression Syntax

    python的正则表达式 正则表达式的概念 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个"规则字符串",这个"规 ...

  9. 2018-01-28-M个本地工作点代码同步到N个GIT远端

    layout: post title: 2018-01-28-M个本地工作点代码同步到N个GIT远端 key: 20180128 tags: IT GIT modify_date: 2018-01-2 ...

  10. Jetson TX2安装tensorflow(原创)

    Jetson TX2安装tensorflow 大致分为两步: 一.划分虚拟内存 原因:Jetson TX2自带8G内存这个内存空间在安装tensorflow编译过程中会出现内存溢出引发的安装进程奔溃 ...