link to ef增删改查

1,我建立了两张表,T_StuInfo,和T_Class,前者的classid是后者的外键。

 

2,下面是补充的link to sql操作

补充的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();

            }

        }
    }
}



posted @ 2012-08-13 12:12  金河  阅读(1657)  评论(1编辑  收藏  举报