LINQ TO SQL中的select

      select这个关键字对于从事数据库开发或者是和数据库相关开发的程序员都特别熟悉,因为它是DML四大语法之一:查询操作。我个人认为的select简单结构:

        1:from 变量名(例如:p) in 表名(例如:Customers);
        2:多表查询(例如:from a in Orders),即在第一个from 语法后再来一个或多少;
        3:条件表达示(例如:where p.ID>5);
        4:分组表达式(例如group p by p.ID);
        5:排序表达式(例如:orderby p.ID);

        6:select 要读取的字段信息(例如:p.ID)。

      说明:

             1:1和6是一定要有的,否则会编译错误。

             2:多表查询可以参考如下文章:

                1>:LINQ TO SQL中的selectMany

                2>:LINQ TO SQL 中的join         

             3:分组可以参数这篇文章:LINQ TO SQL 中的group

      下面是最简单的单表查询:接下来我对上面的6个部分的其中几个部分详细而简单的说明下:

  from p in Customers
  select p

     第一:select的用法,因为关系到最后的查询结果,所以是开发员最关心的地方。

           1:可以直接是一个对象,即不指明任何字段,像上面的select p,这相当于读取p对应表的所有字段,在传统SQL中就是select *的意思,一般实际应用中不推荐这样做,除非字段特别少而且都是要输出的内容。

           2:某一个表的字段名,例如:select p.ID,可以包含一个以上的字段,而且可以包含不同表的字段,下面的几种写法都是正确的:
               1>:select p,读取全部字段;
               2>:select p.ID,一个表的一个字段;
               3>:select p.ID,p.Name,一个表的多个字段;

               4>:select p.ID,A.OrderID,多个表的多个字段。

           3:可以是一个指定的对象:
          
select new Students
           {
              p.Name,
              n.Address
           };

     

           4:可以指定一个匿名对象:      

select new
           {
              Name
=p.Name,
              Address
=n.Address

           };

       

           5:字段和对象不能混合使用,下面的用法都是错误的:

          
select p.ID,
           select 
new
           {
              Name
=p.Name,
              Address
=n.Address
           };
           select p.ID,
           
new
           {
              Name
=p.Name,
              Address
=n.Address
           };

       

          6:如何进行子查询,在select表达式中就可以完成。

         
from c in Customers
select 
new
{
    c.Name,
    Purchases 
=
        from p 
in Purchases
        
where p.CustomerID == c.ID && p.Price > 1000
        select 
new { p.Description, p.Price }
}

       

        7:子查询时给表加上别名,主要是利用let关键字。

from c in Customers
let highValue 
=
    from p 
in c.Purchases
    
where p.Price > 1000
    select 
new { p.Description, p.Price }
select 
new
{
    c.Name,
    Purchases 
= highValue
}

       

       上面的查询也可以写成:


from c in Customers    
select 
new
{
    c.Name,
    Purchases 
= from p in c.Purchases
    
where p.Price > 1000
    select 
new { p.Description, p.Price }
}

    

     第二:select 完成后,就要考虑如何排序了。主要是应用orderby 关键字,descending为降序,否则为升序。     

from p in Purchases
    orderby p.Price descending, p.Description
    select p

    

     第三:如何过滤掉重复记录,我们可以使用Distinct()属性。       

var list6 = (from p in db.Customers
                         select p.ID).Distinct();

  

     第四:如何实现传统SQL中的in和not in, 我们可以利用Contains()来实现。拉姆达表达式支持。

         Customers.Where (c => c.Name.Contains ("a")) 

     第五:如何实现传统SQL中的LIKE表达式:拉姆达表达式支持。

         1:Customers.Where (c => c.Name.Contains ("a")) ,相当于Like '%a%'。
         2:分两种写法:
            1>:Customers.Where (c => c.Name.StartsWith ("a")),相当于Like 'a%'。
            2>:Customers.Where (c => c.Name.EndsWith ("a")),相当于Like '%a'。

            3>:自己扩展一个LIKE的方法。我会在下面的文章中试试扩展LINQ TO SQL的方法。

      总结:select操作对于以数据查询为主的应用程序来说特别重要,了解它的基础结构,原理后才能写出高效的应用程序。听有园友说,LINQ TO SQL可能会被抛弃,无论真与否,心中总不是个滋味,但我还是会坚持学习完LINQ TO SQL,做事总不能半途而废。  
 
注:
   文中参考nutshell示例
  
   
 
posted on 2008-12-24 09:09  min.jiang  阅读(16113)  评论(6编辑  收藏  举报