欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【LINQ】Linq to SQL -- Select语句

程序员文章站 2022-07-04 10:20:36
...

简介

# 作用:查询

# 说明:和SQL命令中的select作用相似,但位置不同。查询表达式中的select及所接句子是放在表达式最后,并把句子中的变量也就是结果返回回来;延迟。

# 9种形式:Select/Distinct操作包括????简单用法、 匿名类型形式、条件形式、指定类型形式、筛选形式、整形类型形式、 嵌套类型形式、本地方法调用形式、Distinct形式 这9种。

举例

一、简单用法

1、返回仅含学生姓名的序列

var n =
		from c in db.Students
		select c.StudentName;

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

二、匿名类型形式

2、使用select和匿名类型返回仅含客户联系人姓名和电话号码的序列

var n =
		from c in db.Customers
		select new { c.ContactName, c.Phone};

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

3、该语句描述:使用select和匿名类型返回仅含雇员姓名和电话号码的序列,并将FirstName和LastName字段合并为一个字段“Name”,此外在所得的序列中将HomePhone字段重命名为Phone。

var n =
		from e in db.Employees
		select new
		 { Name = e.FirstName + " " + e.LastName,
           Phone = e.HomePhone
         };

4、使用select和匿名类型返回所有产品id以及HalfPrice(设置为产品单价除以2所得的值)的序列。

var q =
       from p in db.Products
       select new
       {
           p.ProductID,
           HalfPrice = p.UnitPrice / 2
       };

三、条件形式

5、生成SQL语句为:case when condition then else.

var q =
       from p in db.Products
       select new
       {
           p.ProductName,
           Availability = p.UnitsInStock - p.UnitsOnOrder < 0 ? "Put Of Stock" : "In Stock"
       };

四、指定类型形式

6、使用select和已知类型返回雇员姓名的序列,即:返回自定义类型的对象集。

var q =
       from e in db.Employees
       select new Name
       {
           FirstName = e.FirstName,
           LastName = e.LastName
       };

五、筛选形式

7、结合where使用,起到过滤作用。使用select和where返回仅含中国客户联系人姓名的序列。

var q =
       from c in db.Customers
       where c.City == " China"
       select c.ContactName;

六、shaped形式(整形类型)

8、使用select和匿名类型,返回有关客户的数据的整形子集。查询顾客的id和公司信息(名称、城市、国家)以及联系信息(联系人和职位)。

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

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

七、嵌套类型形式

9、使用嵌套查询但会所有订单及其OrderID的序列、打折订单中项目的子序列以及免送货所省下的金额。

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
       };

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

八、本地方法调用形式(LocalMethodCall)

10、在查询中调用本地方法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方法如下:

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

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))
                     ))));

九、Distinct形式

11、查询顾客覆盖的国家。

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

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