首页 > Entity Framework学习三:查询、插入、更新和删除操作

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

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

更多相关:

  • //获取某一个cookie的值 const getCookie = key => {var k = key, dc = document.cookie;if (dc.length > 0) {var s = dc.indexOf(k + "=");if (s != -1) {s = s + k.length + 1;var e = d...

  • var SGheadMapPoints = {/*obj={ maxLng: minLng: maxLat: minLat: maxCount:最大人数 minCount:最小人数 total:点位数量 }*/get: function (obj) {var arr = [];obj.maxCount || (obj.maxCount...

  • //自动搜索指定的请柬 var alertTipText = "请柬找到了,就在这个网页里面,自己仔细看吧"; var delay = 1 * 1000;//1秒后循环下一页寻找 /*获取子DOM元素在父元素里面的索引位置(是第几个元素)*/ function getNodeListIndex(childNode) {return c...

  •  获取天气情况(不支持跨域) /*json原生获取*/ function getJSON() {var XML;var url = "http://wthrcdn.etouch.cn/weather_mini?city=杭州";if (window.XMLHttpRequest) {XML = new XMLHttpRequest(...

  • 菜鸟一枚,正在学习C++ Gui Qt4,整理很零碎,欢迎批评指正   1.窗口标题: QWidget *window = new QWidget; window->setWindowTitle("Enter Your Age"); **************************************** 关于标题...

  • 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 总体思路是: 比较两个链表头节点,较小的插入新链表指针之后,同时较小链表指针向后移动一位 实现如下: ListNode* mergeTwo...

  • 1.直接调用微软socket对象处理 static void Main(string[] args){try{IPAddress ip = new IPAddress(new byte[] { 127, 0, 0, 1 });//在3721端口新建一个TcpListener对象TcpListener listener = new...

  •   现在很多地方都会用到zookeeper, 用到它的地方就是为了实现分布式。用到的场景就是服务注册,比如一个集群服务器,需要知道哪些服务器在线,哪些服务器不在线。   ZK有一个功能,就是创建临时节点,当机器启动应用的时候就会连接到一个ZK节点,然后创建一个临时节点,那么通过获取监听该路径,并且获取该路径下的节点数量就知道有哪些服务...

  • 前台到后台java时data日期类型的转化 在实体类中用@DataTimeFormat,这样设置即使传过来是空的字符串也是可以转的,要和前面传过来的格式一致,如 @XmlElement(name="BeginDate") @DateTimeFormat(pattern="yyyy-MM-dd") private Date begin...

  • 本文是西门子开放式TCP通信的第2篇,上一篇我们讲了使用西门子1200PLC作为TCP服务器的程序编写,可以点击下方链接阅读:【公众号dotNet工控上位机:thinger_swj】基于Socket访问西门子PLC系列教程(一)在完成上述步骤后,接下来就是编写上位机软件与PLC之间进行通信。上位机UI界面设计如下图所示:从上图可以看出...

  • 我有一个大型数据集,列出了在全国不同地区销售的竞争对手产品。我希望通过使用这些新数据帧名称中的列值的迭代过程,根据区域将该数据帧分成几个其他区域,以便我可以分别处理每个数据帧-例如根据价格对每个地区的信息进行排序,以了解每个地区的市场情况。我给出了以下数据的简化版本:Competitor Region ProductA Product...

  • 作为一名IT从业者,我来回答一下这个问题。首先,对于具有Java编程基础的人来说,学习Python的初期并不会遇到太大的障碍,但是要结合自己的发展规划来制定学习规划,尤其要重视学习方向的选择。Java与Python都是比较典型的全场景编程语言,相比于Java语言来说,当前Python语言在大数据、人工智能领域的应用更为广泛一些,而且大...

  • 这段时间通过学习相关的知识,最大的变化就是看待事物更加喜欢去了解事物后面的本质,碰到问题后解决问题思路也发生了改变。举个具体的例子,我在学习数据分析,将来会考虑从事这方面的工作,需要掌握的相关专业知识这个问题暂且按下不表,那哪些具体的问题是我需要了解的呢,以下简单罗列:1、了解数据分析师这个岗位在各个地区的需求情况?2、数据分析师的薪...

  • 这一节将开始学习python的一个核心数据分析支持库---pandas,它是python数据分析实践与实战的必备高级工具。对于使用 Python 进行数据分析来说,pandas 几乎是无人不知,无人不晓的。今天,我们就来认识认识数据分析界鼎鼎大名的 pandas。目录一. pandas主要数据结构 SeriesDataFrame二...