zoukankan      html  css  js  c++  java
  • 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没也多久,纯粹是以学习笔记的形式整理记录的,如果有不正确的地方请指正,谢谢。   
    从别后, 忆相逢, 几会魂梦与汝同。
  • 相关阅读:
    文摘
    Maximal Square leetcode
    Majority Element II
    Merge k Sorted Lists leetcode
    学习方法-暗时间
    4sum leetcode
    valid parentheses
    两道考研算法设计题- 2010 2013
    regular expression matching DP
    valid sudoku leetcode
  • 原文地址:https://www.cnblogs.com/fangyangwa/p/3091965.html
Copyright © 2011-2022 走看看