linq学习笔记(4):Select/Distinct

     我们利用VS2008来创建DataContext,首先,右键点击项目,选择添加新项,然后选择“Linq to sql 类”,命名为Northwind.dbml。然后打开Northwind.dbml。设计视图上的文字提示你可以从服务器资源管理器或者攻击箱拖动项到设计界面上来创建实体类。那么,我们就在服务器资源管理器中创建一个指向Northwind数据库的数据连接,然后把所有表拖动到Northwind.dbml的设计视图上,按CTRL+S保存。

     Select:和SQL命令中的select作用相似但位置不同,查询表达式中的select及所接子句是放在表达式最后并把子句中的变量也就是结果返回回来;延迟.
Select/Distinct操作包括9种形式,分别为简单形式、匿名类型形式、带条件形式、指定类型形式、过滤类型形式、shaped类型形式、嵌套类型形式、LocalMethodCall形式、Distinct形式。
    1.简单形式
  

描述:查询顾客的联系人

查询语句:

            NorthwindDataContext ndc = new NorthwindDataContext();
            StreamWriter sw 
= new StreamWriter(Server.MapPath("log.txt"), true);
            ndc.Log 
= sw;

            var q 
= from c in ndc.Customers select c.ContactName;

            GridView1.DataSource 
= q;

            GridView1.DataBind();
            sw.Close();

对应SQL语句: 

SELECT [t0].[ContactName]
FROM [dbo].[Customers] AS [t0]

 

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

     2.匿名类型形式

描述:查询顾客的联系人和电话

查询语句:

var q = from c in ndc.Customers select new { c.ContactName, c.Phone };

对应SQL语句:

SELECT [t0].[ContactName], [t0].[Phone]
FROM [dbo].[Customers] AS [t0]

描述:查询雇员的姓名和家庭电话

查询语句:

var q = from c in ndc.Employees select new { 员工姓名 = c.FirstName + " " + c.LastName, 家庭电话 = c.HomePhone };

对应SQL语句:

SELECT ([t0].[FirstName] + @p0) + [t0].[LastName] AS [员工姓名], [t0].[HomePhone] AS [家庭电话]
FROM [dbo].[Employees] AS [t0]
-- @p0: Input NVarChar (Size = 1; Prec = 0; Scale = 0) [ ]

描述:查询产品的ID和产品价格的一般

查询语句:

var q = from c in ndc.Products select new { 产品编号 = c.ProductID, 产品半价 = c.UnitPrice / 2 };

对应SQL语句:

 

SELECT [t0].[ProductID] AS [产品编号], [t0].[UnitPrice] / @p0 AS [产品半价]
FROM [dbo].[Products] AS [t0]
-- @p0: Input Decimal (Size = 0; Prec = 33; Scale = 4) [2]

     3.带条件形式

描述:带条件的查询,返回产品名称和产品可用性

查询语句:

var q = from p in ndc.Products select new { 名称 = p.ProductName, 可用性 = p.UnitsInStock - p.UnitsOnOrder < 0 ? "可用" : "不可用" };

对应SQL语句:

SELECT [t0].[ProductName] AS [名称], 
    (CASE 
        WHEN ((CONVERT(Int,[t0].[UnitsInStock])) 
- (CONVERT(Int,[t0].[UnitsOnOrder]))) < @p0 THEN CONVERT(NVarChar(3),@p1)
        ELSE @p2
     END) AS [可用性]
FROM [dbo].[Products] AS [t0]
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [0]
-- @p1: Input NVarChar (Size = 2; Prec = 0; Scale = 0) [可用]
-- @p2: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [不可用]

     4.指定类型形式

描述:查询返回自定义类型的对象集

查询语句:

 

//自定义类型
public class Name
{
    
public string FirstName { getset; }
    
public string LastName { getset; }
}

//查询语句
var q = from ep in ndc.Employees select new Name { FirstName = ep.FirstName, LastName = ep.LastName };

对应SQL语句:

 

SELECT [t0].[FirstName], [t0].[LastName]
FROM [dbo].[Employees] AS [t0]

     5.过滤类型形式

描述:使用WHERE ,返回只是伦敦客户的联系人姓名一个序列

查询语句:

 

var q = from c in ndc.Customers
        
where c.City == "London"
        select c.ContactName;

对应SQL语句:

SELECT [t0].[ContactName]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[City] 
= @p0
-- @p0: Input NVarChar (Size = 6; Prec = 0; Scale = 0) [London]

     6.shaped类型形式

描述:查询顾客的ID和公司信息(公司名称,城市,国家)以及联系信息(联系人和职位),select操作使用了匿名对象,而这个匿名对象中,其属性也是个匿名对象

查询语句:

            var q =
                from c 
in ndc.Customers
                select 
new
                {
                    c.CustomerID,
                    CompanyInfo 
= new { c.CompanyName, c.City, c.Country },
                    ContactInfo 
= new { c.ContactName, c.ContactTitle }
                };

对应SQL语句:

SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[City], [t0].[Country], [t0].[ContactName], [t0].[ContactTitle]
FROM [dbo].[Customers] AS [t0]

      7.嵌套类型形式

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

查询语句:

            var q =
                from o 
in ndc.Orders
                select 
new
                {
                    o.OrderID,
                    DiscountedProducts 
=
                    from od 
in ndc.Order_Details
                    
where od.Discount > 0.0
                    select od,
                    FreeShippingDiscount 
= o.Freight
                };

对应SQL语句:

SELECT [t0].[OrderID], [t2].[OrderID] AS [OrderID2], [t2].[ProductID], [t2].[UnitPrice], [t2].[Quantity], [t2].[Discount], (
    SELECT COUNT(
*)
    FROM [dbo].[Order Details] AS [t3]
    WHERE [t3].[Discount] 
> @p0
    ) AS [value], [t0].[Freight] AS [FreeShippingDiscount]
FROM [dbo].[Orders] AS [t0]
LEFT OUTER JOIN (
    SELECT [t1].[OrderID], [t1].[ProductID], [t1].[UnitPrice], [t1].[Quantity], [t1].[Discount]
    FROM [dbo].[Order Details] AS [t1]
    WHERE [t1].[Discount] 
> @p0
    ) AS [t2] ON 
1=1 
ORDER BY [t0].[OrderID], [t2].[OrderID], [t2].[ProductID]
-- @p0: Input Float (Size = 0; Prec = 0; Scale = 0) [0]

     8.调用本地方法形式

描述:调用本地方法以' phonenumberconverter '转换电话号码

查询语句:

var q=
    
from c in ndc.Customers
    
where c.Country == "UK" || c.Country == "USA"
    
select new { c.CustomerID, c.CompanyName, Phone = c.Phone, InternationalPhone = PhoneNumberConverter(c.Country, c.Phone) };

对应SQL语句:

SELECT [t0].[CustomerID][t0].[CompanyName][t0].[Phone][t0].[Country]
FROM [dbo].[Customers] AS [t0]
WHERE ([t0].[Country] = @p0OR ([t0].[Country] = @p1)
-- @p0: Input NVarChar (Size = 2; Prec = 0; Scale = 0) [UK]
--
 @p1: Input NVarChar (Size = 3; Prec = 0; Scale = 0) [USA]

     下面也是使用这个方法,创建了一XML文档:

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形式

描述:Distinct筛选字段中不相同的值。用于查询不重复的结果集。查询客户分部的城市。

查询语句:

 var q = (
       
from c in ndc.Customers
       
select c.City).Distinct();

对应SQL语句:

SELECT DISTINCT [t0].[City]
FROM [dbo].[Customers] AS [t0]

 

 

posted @ 2008-08-07 14:07  peida  阅读(3762)  评论(1编辑  收藏  举报