Linq中select查询

Linq中select查询

一、linq中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
     
               }; 
    
    		
  • 二、LINQ to SQL中Select查询的形式

     1.简单用法:

    这个示例返回仅含客户联系人姓名的序列。

  •  
  • var q =
        from c in db.Customers
        select c.ContactName;
    		
  • 注意:这个语句只是一个声明或者一个描述,并没有真正把数据取出来,只有当你需要该数据的时候,它才会执行这个语句,这就是延迟加载(deferred loading)。如果,在声明的时候就返回的结果集是对象的集合。你可以使用ToList() 或ToArray()方法把查询结果先进行保存,然后再对这个集合进行查询。当然延迟加载(deferred loading)可以像拼接SQL语句那样拼接查询语法,再执行它。

    2.匿名类型形式:

    说明:匿名类型是C#3.0中新特性。其实质是编译器根据我们自定义自动产生一个匿名的类来帮助我们实现临时变量的储存。匿名类型还依赖于另外一个特性:支持根据property来创建对象。比如,var d = new { Name = "s" };编译器自动产生一个有property叫做Name的匿名类,然后按这个类型分配内存,并初始化对象。但是var d = new {"s"};是编译不通过的。因为,编译器不知道匿名类中的property的名字。例如string c = "d";var d = new { c}; 则是可以通过编译的。编译器会创建一个叫做匿名类带有叫c的property。 例如下例:new{c,ContactName,c.Phone};ContactName和Phone都是在映射文件中定义与表中字段相对应的property。编译器读取数据并创建对象时,会创建一个匿名类,这个类有两个属性,为ContactName和Phone,然后根据数据初始化对象。另外编译器还可以重命名property的名字。

  •  
  • var q =
        from c in db.Customers
        select new {c.ContactName, c.Phone};
    		
  • 上面语句描述:使用 SELECT 和匿名类型返回仅含客户联系人姓名和电话号码的序列

  •  
  • var q =
        from e in db.Employees
        select new
        {
            Name = e.FirstName + " " + e.LastName,
            Phone = e.HomePhone
        };
    		
  • 上面语句描述:使用SELECT和匿名类型返回仅含雇员姓名和电话号码的序列,并将FirstName和LastName字段合并为一个字段“Name”,此外在所得的序列中将HomePhone字段重命名为Phone。

  •  
  • var q =
        from p in db.Products
        select new
        {
            p.ProductID,
            HalfPrice = p.UnitPrice / 2
        };
    		
  • 上面语句描述:使用SELECT和匿名类型返回所有产品的ID以及HalfPrice(设置为产品单价除以2所得的值)的序列。

    3.条件形式:

    说明:生成SQL语句为:case when condition then else。

  •  
  • 
    var q =
        from p in db.Products
        select new
        {
            p.ProductName,
            Availability =
            p.UnitsInStock - p.UnitsOnOrder < 0 ? 
            "Out Of Stock" : "In Stock"
        };
    		
  • 上面语句描述:使用SELECT和条件语句返回产品名称和产品供货状态的序列。

    4.指定类型形式:

    说明:该形式返回你自定义类型的对象集。

  • var q =
        from e in db.Employees
        select new Name
        {
            FirstName = e.FirstName,
            LastName = e.LastName
        };
    		
  • 上面语句描述:使用SELECT和已知类型返回雇员姓名的序列。

    5.筛选形式:

    说明:结合where使用,起到过滤作用。

  • var q =
        from c in db.Customers
        where c.City == "London"
        select c.ContactName;
    		
  • 上面语句描述:使用SELECT和WHERE返回仅含伦敦客户联系人姓名的序列。

    6.shaped形式(整形类型):

    说明:其select操作使用了匿名对象,而这个匿名对象中,其属性也是个匿名对象。

  •  
  • var q =
        from c in db.Customers
        select new {
            c.CustomerID,
            CompanyInfo = new {c.CompanyName, c.City, c.Country},
            ContactInfo = new {c.ContactName, c.ContactTitle}
        };
    		
  • 语句描述:使用SELECT 和匿名类型返回有关客户的数据的整形子集。查询顾客的ID和公司信息(公司名称,城市,国家)以及联系信息(联系人和职位)。

    7.嵌套类型形式:

    说明:返回的对象集中的每个对象DiscountedProducts属性中,又包含一个集合。也就是每个对象也是一个集合类。

  •  
  • var q =
        from o in db.Orders
        select new {
            o.OrderID,
            DiscountedProducts =
                from od in o.OrderDetails
                where od.Discount > 0.0
                select od,
            FreeShippingDiscount = o.Freight
        };
    		
  • 语句描述:使用嵌套查询返回所有订单及其OrderID 的序列、打折订单中项目的子序列以及免送货所省下的金额。

    8.本地方法调用形式(LocalMethodCall):

    这个例子在查询中调用本地方法PhoneNumberConverter将电话号码转换为国际格式。

  • var q = from c in db.Customers
             where c.Country == "UK" || c.Country == "USA"
             select new
             {
                 c.CustomerID,
                 c.CompanyName,
                 Phone = c.Phone,
                 InternationalPhone = 
                 PhoneNumberConverter(c.Country, c.Phone)
             };
    		
  • PhoneNumberConverter方法如下:

  •  
  • C# 代码   复制
  • public string PhoneNumberConverter(string Country, string Phone)
    {
        Phone = Phone.Replace(" ", "").Replace(")", ")-");
        switch (Country)
        {
            case "USA":
                return "1-" + Phone;
            case "UK":
                return "44-" + Phone;
            default:
                return Phone;
        }
    }
    		
  • 下面也是使用了这个方法将电话号码转换为国际格式并创建XDocument

  •  
  • C# 代码   复制
  • XDocument doc = new XDocument(
        new XElement("Customers", from c in db.Customers
                  where c.Country == "UK" || c.Country == "USA"
                  select (new XElement("Customer",
                          new XAttribute("CustomerID", c.CustomerID),
                          new XAttribute("CompanyName", c.CompanyName),
                          new XAttribute("InterationalPhone", 
                           PhoneNumberConverter(c.Country, c.Phone))
                         ))));
    		
  •  9.Distinct形式:

    说明:筛选字段中不相同的值。用于查询不重复的结果集。生成SQL语句为:SELECT DISTINCT [City] FROM [Customers]

  •  
  • var q = (
        from c in db.Customers
        select c.City )
        .Distinct();
    		
  • 三、ASP.NET中linq select的综合实例

  •  
  • C# 代码   复制
  • class Program 
        { 
            private static List <Student> GetStudents() 
            { 
                List <Student> students = new List <Student> { 
                new Student{ Name="YOUNG", Age=25, Language="Chinese"}, 
                new Student{ Name="JESSIE", Age=21, Language="Scotland"}, 
                new Student{ Name="KELLY", Age=18, Language="English"}, 
                new Student{ Name="JUNE", Age=20, Language="English"}, 
                new Student{ Name="ADRIAN", Age=22, Language="Italy"}, 
                new Student{ Name="BRUCE", Age=17, Language="Scotland"}, 
    标签: