Elijah

治愈系代码研究基地
  首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[传智播客学习日记]Linq to EF 增删改查

Posted on 2012-01-04 00:14  Elijah  阅读(10473)  评论(14编辑  收藏  举报

今天是MVC的课开篇铺垫,主要讲解基础知识Linq语句、lambda表达式、匿名方法、匿名类。

使用EF(实体框架)可以及其方便地创建和修改SQL数据库,它封装了繁琐的SQL代码,通过数据库和对象之间的映射,让程序员可以完全按照面向对象的思路使用linq语句操纵数据库中的数据。

首先,在这个例子里,创建ModelStudent.edmx文件,用它建立Student表,里面有Id,Name,Age三项。去掉主键的自动增长标识,生成SQL语句,即可创建一个货真价实数据表!

在ModelStudent.Designer.cs当中有一个类叫ModelStudentContainer,这个类可以看做我们的数据库,Student类则是这张表对应的类,Student对象就是表中的一行。

接下来看如何进行增删改查操作,代码可以拷贝下来,分段试运行。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//创建数据库实体
ModelStudentContainer DemoDB = new ModelStudentContainer();

#region 增加数据

////创建具体实体(表中一行)
//Student stu1 = new Student()
//{
// ID = 1,
// Name = "张飞",
// Age = 20
//};
//Student stu2 = new Student()
//{
// ID = 2,
// Name = "关羽",
// Age = 21
//};
//Student stu3 = new Student()
//{
// ID = 3,
// Name = "赵云",
// Age = 22
//};
//Student stu4 = new Student()
//{
// ID = 4,
// Name = "刘备",
// Age = 23
//};
//Student stu5 = new Student()
//{
// ID = 5,
// Name = "刘表",
// Age = 24
//};
//Student stu6 = new Student()
//{
// ID = 6,
// Name = "刘禅",
// Age = 25
//};

////将实体stu添加到数据库实体对象中
//DemoDB.Student.AddObject(stu1);
//DemoDB.Student.AddObject(stu2);
//DemoDB.Student.AddObject(stu3);
//DemoDB.Student.AddObject(stu4);
//DemoDB.Student.AddObject(stu5);
//DemoDB.Student.AddObject(stu6);

////保存对数据库的修改
//DemoDB.SaveChanges();

#endregion

#region 查询1:一般查询,查询所有数据

//var result = from u in DemoDB.Student
// select u;

//foreach (var item in result)
//{
// Console.WriteLine("ID:{0},姓名:{1},年龄:{2}。", item.ID, item.Name, item.Age);
//}

#endregion

#region 查询2:使用ToList防止延迟加载,拆分子查询

////这个查询结果可以保存到服务器内存中
//var result1 = (from u in DemoDB.Student
// where u.Age >= 22
// select u).ToList<Student>();

//var result2 = from u in result1
// where u.Name != "赵云"
// select u;

//foreach (var item in result2)
//{
// Console.WriteLine("ID:{0},姓名:{1},年龄:{2}。", item.ID, item.Name, item.Age);
//}

#endregion

#region 查询3:使用Where方法(lambda表达式)

////使用了Where泛型方法,要传入一个lambda表达式
//var result = DemoDB.Student
// .Where<Student>(t => t.ID == 1);

//foreach (var item in result)
//{
// Console.WriteLine("ID:{0},姓名:{1},年龄:{2}。", item.ID, item.Name, item.Age);
//}

#endregion

#region 查询4:Linq分页查询

////要跳过多少页
//int skipPage;
////每页两条数据
//int countPerPage=2;

////从跳过0页到跳过2页(输出第1-3页)
//for (skipPage = 0; skipPage <= 2; skipPage++)
//{
// var result = DemoDB.Student
////分页必须排序
// .OrderBy(t => t.ID)
////跳过指定页数
// .Skip<Student>(skipPage * countPerPage)
////获取条数
// .Take<Student>(countPerPage);

// Console.WriteLine("第{0}页:", skipPage + 1);
////输出查询结果(该页)
// foreach (var item in result)
// {
// Console.WriteLine("ID:{0},姓名:{1},年龄:{2}。", item.ID, item.Name, item.Age);
// }

// Console.WriteLine();
//}

#endregion

#region 查询5:使用匿名类查询多个字段

//var result = from p in DemoDB.Student
// where p.ID < 4
////定义一个包含了ID和Name信息的匿名类
// select new { p.ID, p.Name };

//foreach (var item in result)
//{
////这里无法输出年龄
// Console.WriteLine("ID:{0},姓名:{1}。", item.ID, item.Name);
//}

#endregion

#region 修改1:修改1条记录

////这里没有写where字句,会查询出4条记录
//var result = from u in DemoDB.Student
// select u;

////但是这个方法一次只能取出一条记录
////注:First方法如果返回空值则抛异常
//var target = result.FirstOrDefault<Student>();
////所以只修改了查询结果集中的第一条记录
//target.Name = "司马懿";

//DemoDB.SaveChanges();

#endregion

#region 修改2:修改多条记录

//var result = from u in DemoDB.Student
// select u;

////使用循环方式,修改所有查询到的记录
//foreach (var item in result)
//{
// item.Age = 10;
//}

//DemoDB.SaveChanges();

#endregion

#region 删除

//var result = from u in DemoDB.Student
// where u.Name == "关羽"
// select u;

////删除所有查询结果(这里只有一条结果)
//foreach (var item in result)
//{
// DemoDB.Student.DeleteObject(item);
//}

//DemoDB.SaveChanges();

#endregion

Console.WriteLine("执行完毕!");
Console.ReadKey();
}
}
}