LINQ技术

 

继续学习LINQ to SQL操作SQL Server数据库

通过前面学习LINQ查询表达式(链接1)LINQ查询操作(链接2)LINQ to SQL相关的类型(链接3)DataContext(链接4),我们已经可以自如的使用LINQ to SQL操作SQL Server数据库了:

1.简单查询(略)

2.复杂查询(参考链接1)

  protected void Button1_Click(object sender, EventArgs e)

        {

            linqtosqlDataContext db = new linqtosqlDataContext();

            var result = from comm in db.ComManager

     查询公司管理员表里的管理员名及其管理的公司名   这里的equals是关键字而非方法Equals()   按管理员ID降序排列

                         join com in db.Company on comm.ComManagerID equals com.ComManagerID orderby comm.ComManagerID descending

            经实验匿名类型的属性名绑定到GridView里就是显示的表格的标头名

                         select new {  Manager= comm.Name, Company = com.CompanyName };

            GridView1.DataSource = result;

            GridView1.DataBind();

        }

3.聚合查询(参考链接2)

  protected void Button2_Click(object sender, EventArgs e)

        {

            linqtosqlDataContext db = new linqtosqlDataContext();

            在招聘表里查询桂林山水生态的最高薪水和平均薪水

            此处u.Company实质上与链接3的EntityRef<T>类型有关(多条招聘记录对应一个公司)

   var result1 = db.Employ.Where<Employ>(u => u.Company.CompanyName.Equals("桂林山水生态"));

            var Maxsalary1 = result1.Max<Employ>(u => u.Salary);

            var Aversalary1 = result1.Average<Employ>(u => u.Salary);

            Response.Write(Maxsalary1 + "<br/>");

            Response.Write(Aversalary1);

--------------------------------用了查询表达式和查询操作两种不同的方法,结果相同------------------------------------------

            var result2 = from u in db.Employ

             此处u.Company实质上与链接3的EntityRef<T>类型有关(多条招聘记录对应一个公司)

                          where u.Company.CompanyName.Equals("桂林山水生态")

                          select u.Salary;

            var Maxsalary2 = result2.Max();

            var Aversalary2 = result2.Average();

            Response.Write(Maxsalary2 + "<br/>");

            Response.Write(Aversalary2);

        }

 

4.分组查询(对链接1里的group by into的补充)

  protected void Button3_Click(object sender, EventArgs e)

        {

            linqtosqlDataContext db = new linqtosqlDataContext();

            var result = from u in db.ComManager

查询公司管理员表,并将查询结果按管理员ID大于4的分为一组,其余的为一组,每一组就是一个集合,集合类型为IGrouping<键类型,值类型>(值类型就是数据源里的数据的类型,这里是ComManager,即u的类型.而键类型就是by后面的类型,这里为bool类型,每一个组都有一个键类型,这里如果键类型为true就说明该组的数据的管理员ID大于4),然后将这些集合付给(into)g,等到返回给result时又包了一层变成了IQueryable<IGrouping<bool,ComManager>>类型了

                         group u by u.ComManagerID>4  into g

                         select g;

先"剥掉"IQueryable<>,里面的item就是各个组了,其类型是IGrouping<bool,ComManager>

            foreach (var item in result)

            {

通过IGrouping<>的Key属性可以用来区分个组,然后根据条件选出一个组来进行操作

                if (item.Key==true)

                {

                    GridView1.DataSource = item;  可以想象IGrouping<>也继承自IEnumerable<>

                    GridView1.DataBind();

                }

            }

        }

可以看出LINQ里的group分组语句与SQL里的group分组语句不一样,SQL里的group分组语句作用是去掉重复的记录,并且select 1,2,3 from * group by 1,2,3里group by后面有1,2,3  select后面也必须是1,2,3     然后对于字段1,2,3都相同的记录只保留一条, 由于select后面只有1,2,3  所以该条记录也只有这三个字段

LINQ里的group分组语句通过LINQPad可以很好理解:

 

var result=from u in ComManagers group u by u.Name into g select g;

result.Dump();  C#Statement(s)  LINQPad里把每个表都变成了复数且区分大小写

根据企业管理员的名字分组(即名字相同的为一组),根据我们前面说的,每一组的类型为IGrouping<string,ComManager>,组的键类型是string,里面的元素类型为ComManager,看结果图:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

看到每一个组都有一个Key了吧,我们可以想上面的代码那样通过这个Key属性来区分每一个组,然后再做不同处理

 

 

 

5.向数据库中插入数据

 

插入功能由Table<T>类的InsertOnSubmit()添加一条记录InsertAllOnSubmit<T>()添加多条记录

 protected void Button4_Click(object sender, EventArgs e)

        {

            linqtosqlDataContext db = new linqtosqlDataContext();

            LeaveWord lw = new LeaveWord();

            lw.CompanyID = 19;

            lw.Accounter = "GJ";

            lw.Content = "贵公司......";

            lw.Reply = "?????";

            db.LeaveWord.InsertOnSubmit(lw);

            db.SubmitChanges();

        }

 protected void Button5_Click(object sender, EventArgs e)

        {

            linqtosqlDataContext db = new linqtosqlDataContext();

            List<LeaveWord> list = new List<LeaveWord>();

            LeaveWord lw1 = new LeaveWord();

            lw1.CompanyID = 19;

            lw1.Accounter = "GJ";

            lw1.Content = "贵公司||||||||";

            lw1.Reply = "?????";

            LeaveWord lw2 = new LeaveWord();

            lw2.CompanyID = 19;

            lw2.Accounter = "GJ";

            lw2.Content = "贵公司/";

            lw2.Reply = "?????";

            list.Add(lw1);

            list.Add(lw2);

            db.LeaveWord.InsertAllOnSubmit<LeaveWord>(list);   参数类型是IEnumerable<T>,但只要是继承自IEnumerable<T>的类型都可以,这里是List<T>

            db.SubmitChanges();

        }

6.修改数据库中的数据

一般步骤如下:

(1)使用LINQ查询找到要被修改的记录

(2)修改记录值

(3)调用SubmitChanges()方法将修改提交到数据库

 protected void Button6_Click(object sender, EventArgs e)

        {

            linqtosqlDataContext db = new linqtosqlDataContext();

            使用LINQ查询找到要被修改的记录

            var result = from u in db.LeaveWord where u.Accounter.Equals("GJ") select u;

            foreach (var item in result)

            {

                修改记录值

                item.Content = "留言内容被修改!";

            }

            调用SubmitChanges()方法将修改提交到数据库

            db.SubmitChanges();

        }

7.删除数据库中的数据

删除功能由Table<T>类的DeleteOnSubmit()删除一条记录DeleteOnSubmit<T>()删除多条记录

一般步骤如下:

(1)使用LINQ查询找到要被删除的记录

(2)一般使用DeleteOnSubmit<T>()方法删除这些记录

(3)调用SubmitChanges()方法将删除提交到数据库

 protected void Button7_Click(object sender, EventArgs e)

        {

            linqtosqlDataContext db = new linqtosqlDataContext();

            使用LINQ查询找到要被删除的记录

            var result = from u in db.LeaveWord where u.Accounter.Equals("xb") select u;

            使用DeleteOnSubmit<T>()方法删除这些记录

            db.LeaveWord.DeleteAllOnSubmit<LeaveWord>(result);

            调用SubmitChanges()方法将删除提交到数据库

            db.SubmitChanges();

        }

值得注意的是以上5,6,7的增删改操作建议在.NET4.0下操作,在.NET3.5下会出现指定转换无效的Bug

8.使用存储过程操作数据库(参考链接3里的IExecuteResult,ISingleResult<T>,IMultipleResult三种接口)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值