1,我建立了两张表,T_StuInfo,和T_Class,前者的classid是后者的外键。
2,下面是补充的link to sql操作

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Linq; using System.Xml.Linq; using System.Data.Objects; namespace Console1 { class Program { static void Main(string[] args) { //创建数据库实体 using (studentEntities stuEntity = new studentEntities()) { #region 使用ObjectQuery的返回执行的sql语句 //ObjectQuery<T_StuInfo> stuinfo = stuEntity.T_StuInfo;//对概念性模型的类型化查询 //IQueryable<T_StuInfo> stu1 = from c in stuinfo // select c; //Console.WriteLine(stu1.Count()); //输出数据个数 //Console.WriteLine(stuinfo.ToTraceString());//输出对数据源执行的命令 #endregion #region 条件限制 //ObjectQuery<T_StuInfo> stuinfo = stuEntity.T_StuInfo;//得到查询对象 //IQueryable<T_StuInfo> stu1 = from c in stuinfo //查询结果放进IQueryable中 // where c.stuid < 5 // select c; //Console.WriteLine(stu1.Count()); //foreach(var c in stu1) //{ // Console.WriteLine("姓名:{0},电话:{1}",c.name,c.phone); //} //var stu2 = stuEntity.T_StuInfo.Where(c=>c.name =="王金河7");//使用表的where直接查询 //Console.WriteLine(stu2.Count()); //foreach(var c in stu2) //{ // Console.WriteLine("姓名:{0},电话:{1}",c.name,c.phone); //} #endregion #region 排序和分页 //ObjectQuery<T_StuInfo> stuinfo = stuEntity.T_StuInfo; //IQueryable<T_StuInfo> stu1 = (from c in stuinfo // orderby c.stuid //分页必须排序 // select c).Skip(4).Take(4); //Console.WriteLine(stu1.Count()); //foreach (var c in stu1) //{ // Console.WriteLine("姓名:{0},电话:{1}", c.name, c.phone); //} ////基于方法的查询语法 //var stu2 = stuEntity.T_StuInfo.OrderBy(c => c.stuid).Skip(4).Take(4); //Console.WriteLine(stu2.Count()); //foreach (var c in stu2) //{ // Console.WriteLine("姓名:{0},电话:{1}", c.name, c.phone); //} #endregion #region 聚合:运算符有Average、Count、Max、Min 和 Sum //var maxstuid = stuEntity.T_StuInfo.Max(p => p.stuid);//得到最大的学号 //var minstuid = stuEntity.T_StuInfo.Min(p => p.stuid);//得到最小的学号 //var count = stuEntity.T_StuInfo.Count();//得到所有学生的个数 //var sum = stuEntity.T_StuInfo.Sum(p => p.stuid);//得到所有的学号和 //var average1 = stuEntity.T_StuInfo.Average(p=>p.stuid);//得到学号的平均值 //double average2 =(double) sum / count; //Console.WriteLine("学号最大值:{0},最小值:{1},总和:{2},个数:{3},聚合平均值:{4},求值平均值:{5}", // maxstuid, minstuid, sum, count, average1, average2); #endregion #region 连接 //接有Join 和 GroupJoin 方法。GroupJoin组联接等效于左外部联接, //它返回第一个(左侧)数据源的每个元素(即使其他数据源中没有关联元素) //var query = from d in stuEntity.T_StuInfo // join cls in stuEntity.T_Class //连接到另一个表 // on d.classid equals cls.classid //连接条件 // where d.stuid < 10 // select new //匿名类得到结果 // { // StuId = d.stuid, // StuName = d.name, // Phone = d.phone, // ClassId= d.classid, // ClassName = cls.name // }; //foreach (var q in query) //{ // Console.WriteLine("学号:{0},姓名:{1},电话:{2},班级:{3}", q.StuId, q.StuName, q.Phone, q.ClassName); //} #endregion #region 排序信息丢失 //如果在排序操作之后执行了任何其他操作,则不能保证这些附加操作中会保留排序结果。 //这些操作包括 Select 和 Where 等。 //另外,采用表达式作为输入参数的 First 和 FirstOrDefault 方法不保留顺序。 //如下代码,并不一定能实现降序排序 //IQueryable<T_StuInfo> stuinfo = stuEntity.T_StuInfo.OrderByDescending(c => c.stuid) // .Where(c => c.name != null).Select(c => c); //foreach (var c in stuinfo) //{ // Console.WriteLine("学号:{0},姓名:{1}", c.stuid, c.name); //} #endregion #region 不支持引用非标量闭包 //不支持在查询中引用非标量闭包(如实体)。在执行这类查询时,会引发 NotSupportedException //异常,并显示消息“无法创建类型为“结束类型”的常量值。 //此上下文中仅支持基元类型(如 Int32、String 和 Guid) //T_StuInfo stu = stuEntity.T_StuInfo.FirstOrDefault(); //IQueryable<string> cc = from c in stuEntity.T_StuInfo // where c == stu // select c.name; //foreach (string name in cc) // Console.WriteLine(name); #endregion Console.WriteLine("OK"); Console.Read(); } } } }
3,下面是对他的操作。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Data.Linq; using System.Xml.Linq; namespace Console1 { class Program { static void Main(string[] args) { //创建数据库实体 using (studentEntities stuEntity = new studentEntities()) { #region 增加数据(构造对象,AddObject,SaveChanges) //T_StuInfo stu1 = new T_StuInfo() //{ // name = "李四",//构造函数赋值时为逗号 // phone="12456777", // classid=2 //};//构造函数体外面为分号 //T_StuInfo stu2 = new T_StuInfo(); //stu2.name = "王五"; //stu2.phone = "124"; //stu2.classid = 2; ////将实体stu添加到数据库实体对象中 //stuEntity.T_StuInfo.AddObject(stu1);//将对象添加到当前实体集的上下文中 //stuEntity.T_StuInfo.AddObject(stu2); //stuEntity.SaveChanges();//保存对数据库的修改 #endregion #region 查询1:一般查询,查询所有数据(一条select from语句搞定) //var result = from u in stuEntity.T_StuInfo //假设u是表中的一行 // select u;//把这一行选择出来 //foreach (var item in result) //迭代 //{ // Console.WriteLine("ID:{0,2},姓名:{1,5},电话:{2,10},班级ID:{3}", item.stuid, item.name, item.phone, item.classid); //} #endregion #region 查询2:使用ToList防止延迟加载,拆分子查询(select from后ToList) //这个结果可以保存到服务器内存中 //var result1 = (from u in stuEntity.T_StuInfo // where u.classid == 2 // select u).ToList<T_StuInfo>();//将数据督导集合中 //var result2 = (from u in result1 // where u.name != "王金河" // select u); //foreach (var item in result2) //{ // Console.WriteLine("ID:{0},姓名:{1},电话:{2},班级id:{3},班级名:{4}", item.stuid, item.name, item.phone, item.classid, item.T_Class.name); //}//因为T_StuInfo的classid是T_Class的外键,可以使用item.T_Class.name关联查询 #endregion #region 查询3:使用Where方法(lambda表达式)(将条件写到对象的where语句中) //使用where泛型方法,要转入一个lambda表达式 //var result = stuEntity.T_StuInfo.Where<T_StuInfo>(t => t.classid == 2); //foreach (var item in result) //{ // Console.WriteLine("id:{0},name:{1},phone:{2},classid:{3}", item.stuid, item.name, item.phone, item.classid); //} #endregion #region 查询4:Linq分页查询(调用对象的OrderBy排序,Skip跳过多少页,Take取出多少数据) //要跳过多少页 //int skipPage; ////每页两条数据 //int countPerPage = 2; ////从跳过0页到跳过2页(输出第1-3页) //for (skipPage = 0; skipPage <= 2; skipPage++) //{ // var result = stuEntity.T_StuInfo // .OrderBy(t => t.stuid) //分页必须排序 // .Skip<T_StuInfo>(skipPage * countPerPage) //跳过制定页数 // .Take<T_StuInfo>(countPerPage);//获取制定条数 // Console.WriteLine("第{0}页:", skipPage + 1); // //输出查询结果(该页) // foreach (var item in result) // { // Console.WriteLine("id:{0},name:{1},phone:{2},classid:{3}", item.stuid, item.name, item.phone, item.classid); // } //} #endregion #region 查询5:使用匿名类查询多个字段(select时new一个匿名类) //var result = from p in stuEntity.T_StuInfo // where p.stuid < 5 // select new { p.name, p.phone };//定义一个包含了name和phone的匿名类 //foreach (var item in result) //{ // Console.WriteLine("姓名:{0},电话:{1}.", item.name, item.phone); //} #endregion #region DataLoadOptions防止延迟加载 //使用 LoadWith 方法可指定应同时检索与主目标相关的哪些数据。 ////使用DadaLoadOptions需要添加对System.Data.Linq的引用 //DataLoadOptions dlo = new DataLoadOptions();//提供相关数据的立即加载或筛选 //dlo.LoadWith<T_StuInfo>(t => t.T_Class);//加载学生信息的同时加载班级信息 ////???????????此处有问题,找不到stuEntity.LoadOptions属性 //stuEntity.LoadOptions = dlo; #endregion #region 修改1:修改1条记录(先查找,然后再修改) //var result = from u in stuEntity.T_StuInfo // select u;//查询出所有的数据 ////这个方法一次只能取出一条记录,如果first方法返回空值则抛出异常 //var target = result.FirstOrDefault<T_StuInfo>(p => p.name == "王五"); //target.name = "刘洋司南"; //stuEntity.SaveChanges();//保存设置 #endregion #region 修改2:修改多条记录(查出来多个数据,循环修改) //var result = from u in stuEntity.T_StuInfo // select u; ////使用循环方式修改所有查询到得记录 //foreach (var item in result) //{ // item.phone = "110"; //} //stuEntity.SaveChanges(); #endregion #region 删除(先查找,然后用DeleteObject删除) //var result = from u in stuEntity.T_StuInfo // where u.name == "刘洋司南" // select u; ////删除所有查询记录 //foreach (var item in result) //{ // stuEntity.T_StuInfo.DeleteObject(item); //} //stuEntity.SaveChanges(); #endregion Console.WriteLine("Succeed"); Console.Read(); } } } }