EntityFrameWork实现部分字段获取和修改(含源码)
EntityFrameWork类库,是微软推出的ORM组件,它是基于Ado.Net的,个人感觉还是非常 好用的。以下介绍的2个功能点分别是部分字段更新和获取
-----------------------------------------------------------------------------
博客搬家啦,新地址:
-----------------------------------------------------------------------------
解决部分字段Update。本方案采用仓储模式
步骤1:定义接口,实现仓库基类
步骤2:实现接口
步骤3:定义DbContext对象
步骤4:创建Access对象
步骤5:调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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(); } |
1 | 是不是so easy!!! |
下面再介绍另一个实用的功能,如果更新时,我们能够动态的记录类中哪些属性有变化,只将有变化的属性作为待更新字即可,实现起来也不复杂。代码如下
看调用的代码中,下面这个变量就是存储哪些属性有值变化的,是不是也很简单?!!!
1 | pModel.UpdateColumnNames |
不过,在这里要强调下,使用部分字段更新方式,在性能上仍然存在缺陷。原因:在数据量多的时候,每次Update时,都要在内存中循环找数据匹配,提交数据多的时候,不推荐使用
推荐使用EF扩展类库,就是上面代码中第2种方案,这种方式是最接近Ado.Net方式
解决部分字段获取
下面介绍几种方法,只返回部分字段,就是使用Linq语法中的Select关键字
已知条件:创建一个SqlServer数据库(其他类型数据库均可),再创建ba_unit表,字段包括:UnitCode,UnitName,SortNo,Status
代码如下所示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | 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
即可下载
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述