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

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

 

----------------------------------------------------------------------------- 

博客搬家啦,新地址:

https://www.navisoft.com.cn

-----------------------------------------------------------------------------

 

 

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

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

IRepository.png

  步骤2:实现接口

Repository.png

   步骤3:定义DbContext对象

TestDbContext.png

  步骤4:创建Access对象

baunitAccess.png

  步骤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!!!

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

baunitBillModel.png

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

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

即可下载

  

posted @   斜杠青年小Q  阅读(1416)  评论(1编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 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的设计模式综述
点击右上角即可分享
微信分享提示