linq 入门 查询基础

 
通过上一篇想必大家已经知道了如何创建linq to sql 模型,并对linq有了一个简单的了解。我们这篇主要来说一下linq操作数据库的一些基本操作,列出了sql语句和linq两种格式,方便大家参考。首先我们需要实例化我们刚才创建的对象模型,代码如下:
          
   string strSql = "server=.;database=OnlineTraining;uid=sa; pwd=123456";
            MyEntities.DataClasses1DataContext myLinq = new MyEntities.DataClasses1DataContext(strSql);
<1>基本查询 :
 sql:   select * from student
 linq:   var query=from stu in myLinq.student select stu   
  LINQ 查询中,必须以from 开始,引入数据源 ( student  ) 和范围变量 ( stu  )。当然这一句是最简单的查询,你也可以在查询的同时对你的查询结果进行一个转换比如: 
var query= from stu in myLinq.student

                    select new 
                    {
                        编号=stu.Id,
                         姓名=stu.UserName
                        ……
                    }

 如果你只想取要查询的表中的某几个字段而不是全部则:

var query=stu in myLinq.student select new {stu.Id,stu.Name}

 <2>条件查询 : 

sql:   select * from student where Id='1' and UserName='张三'     

 linq:   var query= from stu in myLinq.student
                    where  stu.Id='1'&& stu.UserName='张三'   
             select stu

按照条件查询基本和sql语句的写法是一样的,唯一的区别就是在sql中表示并列用and 而linq中用&&(表示并列,这个符号相信大家都不陌生。同样,linq中用||表示或,sql中用or

 
 <3>排序     
 sql:  select * from student order by  Id desc
 linq:  var query= from stu in myLinq.student  orderby stu.Id descending 
                      select stu
和sql一样在linq也中默认为升序,ascending表示升序,descending表示降序 
<4> 分页 返回数据     
var query= from stu in myLinq.student.skip(pageIndex*pageSize).take(pageSize); 
linq查询数据时候的这个分页功能不能不说确实很强大,你只需要一句代码就搞定了,省去了写分页存储过程或者分页的sql语句的时间。skip()为跳过的 行数,take()为你当前一页显示的行数。  
 <5>多表联合自连接  
sql: select * from Candidates_are c ,PayOrder p where c.UserID=p.UserID and p.IsPay=1 and c.Id_no='idCardNumber' 
linq: var query = from uid in c.Candidates_are
           from pay in c.PayOrder
           where uid.UserID == pay.UserID && pay.IsPay == true && uid.Id_no == idCardNumber
           select uid; 
 select uid指定取到数据的范围,比如要区没张表中的某些字段可用 select new {uid.***,pay.***}
<6>join on 单条件
 sql:    select * from Candidates_are c join PayOrder p on c.UserID=p.UserID  and p.IsPay=1  and c.Id_no='idCardNumber '
  linq:     var query = from user in c.Candidates_are
               on user.UserID equals pay.UserID
               where user.Id_no equal sidCardNumber 
               select user;      
 
<7>join on 多条件 如下:
var Query = from stu in stuList
                           join stuCour in c.StudentCourseware
                           on new { p1 = stu.IdentityCardNumber, p2 = year } equals new { p1 = stuCour.IdentityCardNumber, p2 = stuCour.Year }
                           select new
                           {
                               stu.IdentityCardNumber,
                               stu.TrueName,
                               stu.Phone,
                               stu.WorkUnit,
                               stu.UnitNatureCode,
                               stuCour.TrainingId,
                               stuCour.Year
                           };

这里简要说明一下博主在实际开发中遇到的一些问题,在多张表的联合查询中linq和直接执行sql语句相比效率较低,join on 联合查询比多个from的自连接查询方式要快,不知道是什么原因。在上面的所有例子中

变量query只是指定了linq查询,该查询并不是通过赋值语句执行的。只有使用forech循环访问查询时或ToList()的时候查询才会执行。在构建查询语句的时候应对尽可能的减少使用ToList()操作,大量的ToList()操作会严重影响性能。  
好了这一节就这么多了,由于博主也是学习linq没也多久,纯粹是以学习笔记的形式整理记录的,如果有不正确的地方请指正,谢谢。   
posted @ 2013-05-22 00:07  放羊娃  阅读(622)  评论(0编辑  收藏  举报