1.LINQ过滤数据 

var query = from person in context.Peoplewhere person.FirstName.StartsWith("a")select person;
var methodQuery = context.People.Where(p => p.FirstName.StartsWith("a"));

两种不同的写法,效果一样。

  • 多条件组合查找
var query = from person in context.Peoplewhere person.FirstName.StartsWith("a") &&person.LastName.EndsWith("b")select person;
var methodQuery = context.People.Where(p => p.FirstName.StartsWith("a") && p.LastName.EndsWith("b"));

  • 对查找结果排序升序:
            var query = from person in context.Peoplewhere person.FirstName.StartsWith("a") &&person.LastName.EndsWith("b")orderby person.FirstName,person.LastNameselect person;var methodQuery = context.People.Where(p => p.FirstName.StartsWith("a") && p.LastName.EndsWith("b")).OrderBy(p => p.FirstName).ThenBy(p => p.LastName);

  • 对查找结果排序降序:
            var query = from person in context.Peoplewhere person.FirstName.StartsWith("a") &&person.LastName.EndsWith("b")orderby person.FirstName,person.LastNamedescendingselect person;var methodQuery = context.People.Where(p => p.FirstName.StartsWith("a") && p.LastName.EndsWith("b")).OrderByDescending(p => p.FirstName).ThenByDescending(p => p.LastName);
  • 延迟加载和贪婪加载(Lazy Loading和eager loading)

如果不确定是否要加载关联数据时就使用延迟加载,否则就使用贪婪加载。当然这个不是固定的看具体什么场景下使用。默认情况下延迟加载是生效的,可以在创建DbContex后配置选项

context.Configuration.LazyLoadingEnabled = false;

2.插入数据

多种方法,不多说看代码:

  • 方法一
var person = new Person
{
BirthDate = new DateTime(1980, 1, 2),
FirstName = "John",
HeightInFeet = 6.1M,
IsActive = true,
LastName = "Doe",
MiddleName = "M"
};
person.Phones.Add(new Phone { PhoneNumber = "1-222-333-4444" });
person.Phones.Add(new Phone { PhoneNumber = "1-333-4444-5555" });
using (var context = new Context())
{
context.People.Add(person);
context.SaveChanges();
}

方法二:改变Entity的状态

using (var context = new Context())
{
context.Entry(person2).State = EntityState.Added;
context.SaveChanges();
}

EntityState:Added、Deleted、Detached(DbContex不追踪Entity状态)、Modified、Unchanged

3.更新数据

多种方法:

方法一:

using (var context = new Context())
{
var person = context.People.Find(1);
person.FirstName = "New Name";
context.SaveChanges();
}

方法二(建议使用)注意标记部分:

var person2 = new Person
{
PersonId = 1,
BirthDate = new DateTime(1980, 1, 2),
FirstName = "Jonathan",
HeightInFeet = 6.1m,
IsActive = true,
LastName = "Smith",
MiddleName = "M"
};
person2.Phones.Add(new Phone
{
PhoneNumber = "updated 1",
PhoneId = 1,
PersonId = 1
});
person2.Phones.Add(new Phone
{
PhoneNumber = "updated 2",
PhoneId = 2,
PersonId = 1
});
using (var context = new Context())
{
context.Entry(person2).State = EntityState.Modified;
context.SaveChanges();
}

你会发现执行上面代码只有Person数据更新了,Phone数据没有更新,这是因为Insert和Update机制不一样,Update时设置了Entity的EntityState,但是并没有传播到子数据的状态,需要都上面程序做些修改

using (var context = new Context())
{
context.Entry(person2).State = EntityState.Modified;
foreach (var phone in person2.Phones)
{
context.Entry(phone).State = EntityState.Modified;
}
context.SaveChanges();
}

在开发Web程序时可以使用AsNoTracking来提高查询性能

using (var context = new Context())
{
var query = context.People.Include(p =>
p.Phones).AsNoTracking();
foreach (var person in query)
{
foreach (var phone in person.Phones)
{
}
}
}

  • 使用Attach 会改变状态为Unchanged,并开始追踪Entity的状态
var person3 = new Person
{
PersonId = 1,
BirthDate = new DateTime(1980, 1, 2),
FirstName = "Jonathan",
HeightInFeet = 6.1m,
IsActive = true,
LastName = "Smith",
MiddleName = "M"
};
using (var context = new Context())
{
context.People.Attach(person3);
person3.LastName = "Updated";
context.SaveChanges();
}

上面代码执行将仅仅只会更新LastName列。也可以用以下代码替代Attach方法

context.Entry(person3).State = EntityState.Unchanged

4.删除数据

  • 方法一:先查询出数据,再删除(注意删除子数据可以使用设置数据库级联删除更方便)
using (var context = new Context())
{
var toDelete = context.People.Find(personId);
toDelete.Phones.ToList().ForEach(phone =>context.Phones.Remove(phone));
context.People.Remove(toDelete);
context.SaveChanges();
}

  • 方法二:使用改变状态
var toDeleteByState = new Person { PersonId = personId };
toDeleteByState.Phones.Add(new Phone
{
PhoneId = phoneId1,
PersonId = personId
});
toDeleteByState.Phones.Add(new Phone
{
PhoneId = phoneId2,
PersonId = personId
});
using (var context = new Context())
{
   context.People.Attach(toDeleteByState);
   foreach (var phone in toDeleteByState.Phones.ToList()){context.Entry(phone).State = EntityState.Deleted;}context.Entry(toDeleteByState).State = EntityState.Deleted;context.SaveChanges();
}

5.查询本地数据

当需要查询的数据已经在内存中,而未提交到数据库时对内存数据进行查询

var localQuery = context.People.Local.Where(p =>
p.LastName.Contains("o")).ToList();

转载于:https://www.cnblogs.com/zjmsky/p/4823847.html

Entity Framework学习三:查询、插入、更新和删除操作相关推荐

  1. python查询mysql数据库_python针对mysql数据库的连接、查询、更新、删除操作示例...

    本文实例讲述了python针对mysql数据库的连接.查询.更新.删除操作.分享给大家供大家参考,具体如下: 连接 一 代码 import pymysql # 打开数据库连接 db = pymysql ...

  2. 关于Entity Framework自动关联查询与自动关联更新导航属性对应的实体注意事项说明...

    一.首先了解下Entity Framework 自动关联查询: Entity Framework 自动关联查询,有三种方法:Lazy Loading(延迟加载),Eager Loading(预先加载) ...

  3. Entity Framework 学习

    Entity Framework 学习初级篇1--EF基本概况... 2 Entity Framework 学习初级篇2--ObjectContext.ObjectQuery.ObjectStateE ...

  4. Entity Framework学习中级篇

    1-EF支持复杂类型的实现 本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作. 通常,复杂类型是指那些由几个简单的类型组合而成的类型.比如:一张Customer表,其中 ...

  5. Entity Framework 学习中级篇—EF支持复杂类型的实现

    http://www.cnblogs.com/xray2005/archive/2009/06/01/1493661.html 本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的 ...

  6. Entity Framework 学习中级篇1—EF支持复杂类型的实现

    本节,将介绍如何手动构造复杂类型(ComplexType)以及复杂类型的简单操作. 通常,复杂类型是指那些由几个简单的类型组合而成的类型.比如:一张Customer表,其中有FristName和Las ...

  7. Entity Framework 学习建议及自学资源

    Entity Framework 学习建议及教学PPT 金旭亮 =============================================== EntityFramework(EF)是 ...

  8. entity framework学习笔记

    学习ef首先要介绍一些基本的概念. 1,概念模型: 就是讲世界上具体的事物抽象为某一种信息结构,这种结构并不依赖于某种计算机,不是某种数据库 支持的数据模型,而是一种概念性的模型.如下图 2,ef的实 ...

  9. mysql插入第一_mySQL教程 第5章 插入 更新与删除数据

    第5章 插入 更新与删除数据 使用SQL Manager管理工具连接到schoolDB.由于三张表都设置了主键,因此,以下练习中插入的记录,主键不能重. 插入数据 1. 练习:为表的所有字段插入数据 ...

最新文章

  1. SmartImageView框架的使用
  2. 奥托尼克斯接近开关型号_12月23日NBA | 骑士VS老鹰、尼克斯VS奇才、开拓者VS鹈鹕...
  3. 易语言python1.1模块_易语言之编写模块与引入模块
  4. java分割两个时间段不在同月份
  5. 解决编译错误: 非法字符: '\ufeff' 解决方案|错误: 需要class, interface或enum
  6. http请求,普通的get和post方法
  7. 微擎不现实数组_Java这个类,大概就和现实中吃饭一样常见
  8. 【HDU 5869】Different GCD Subarray Query【区间不同 gcd 个数】
  9. [转]C#反射,根据反射将数据库查询数据和实体类绑定,并未实体类赋值
  10. visio2003 反向工程链接 mssql2005
  11. 学习WEB的心理路程
  12. 百度提交网站提示您无权访问该页面,点击确定按钮返回首页,如何解决
  13. 实验8 OpenGL太阳系动画
  14. c语言if后面的表达式是什么类型,if语句后面的表达式应该是什么?
  15. 如果一个人没有明确的目标,他的人生就像是一艘没有罗盘的船
  16. C/C++项目开发:《火柴人游戏》,500行源代码开发
  17. 极简烟雨图床正式版源码V2.1.3/高速外链图床
  18. 用exec()函数执行新程序
  19. 基于springboot实现学校线上教学平台管理系统【源码+论文】分享
  20. MyCat 的入门和放弃

热门文章

  1. node sqlite 插入数据_安卓手机中的应用数据都保存在哪些文件中?
  2. Linux数组计算平均值,从数组中读取并计算平均值
  3. java双目运算符重载,c++类的单目和双目运算符的重定义
  4. python 工业自动化 人工智能_Python人工智能之路 - 第三篇 : PyAudio 实现录音 自动化交互实现问答...
  5. 窗帘效果图css,vuejs、微信小程序窗帘效果
  6. JAVA求是否为闰年,for-while循环,输出你好
  7. OpenCV(十二)漫水填充算法
  8. php字符串数组访问,php – 按字符串键x访问数组,其中x是“123”
  9. 查找计算机 域服务不可用,win7系统打印文件提示Active Directory域服务不可用解决方法...
  10. git 打tag_图文讲解,团队开发中的 Git 最佳实践