【LINQ】Linq to SQL -- Select语句

简介

# 作用:查询

# 说明:和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}

LINQ to SQL语句(1)之Where 2 Where操作 2 1.简单形式: 2 2.关系条件形式: 2 3.First()形式: 3 LINQ to SQL语句(2)之Select/Distinct 3 1.简单用法: 4 2.匿名类型 形式: 4 3.条件形式: 5 4.指定类 型形式: 6 5.筛选形式: 6 6.shaped形式(整形类型): 6 7.嵌套类型形式: 7 8.本地方法调用 形式(LocalMethodCall): 7 9.Distinct形式: 8 LINQ to SQL语句(3)之Count/Sum/Min/Max/Avg 9 1.简单形式: 9 2.带条件形 式: 9 1.简单形式: 10 2.映射形式: 10 3.元素 : 11 1.简单形式: 11 2.映射形式: 11 3.元素: 11 1.简单形式: 12 2.映射形式: 12 3.元素: 12 LINQ to SQL语句(4)之Join 13 Join操作符 13 1.一对多关系(1 to Many): 13 2.多对多关系(Many to Many): 14 3.自联接关系: 15 1.双向联接(Two way join): 15 2.三向联接(There way join): 16 3.左外部联接(Left Outer Join): 17 4.投影的Let赋值(Projected let assignment): 17 5.组合键(Composite Key): 18 6.可为null/不可为null的键关系 (Nullable/Nonnullable Key Relationship): 19 LINQ to SQL语句(5)之Order By 19 Order By操作 19 1.简单形式 19 2.带条件形式 20 3.降序排序 20 4.ThenBy 20 5.ThenByDescending 22 6. 带GroupBy形式 22 LINQ to SQL语句(6)之Group By/Having 23 Group By/Having操作符 23 1.简单形式: 23 2.Select匿名类 : 24 3.最大 值 25 4.最小 值 26 5.平均 值 26 6.求和 26 7.计数 27 8.带条件计数 27 9.Where限制 28 10.多列(Multiple Columns) 28 11.表达式(Expression) 29 LINQ to SQL语句(7)之Exists/In/Any/All/Contains 29 Exists/In/Any/All/Contains操作符 29 Any 29 1.简单形式: 29 2.带条件形式: 30 All 30 Contains 31 1.包含一个对象: 31 2.包含多个值: 32 LINQ to SQL语句(8)之Concat/Union/Intersect/Except 32 Concat/Union/Intersect/Except操作 32 Concat(连接) 32 1.简单形式: 33 2.复 合形式: 33 Union(合并) 33 Intersect(相交) 34 Except(与非) 34 LINQ to SQL语句(9)之Top/Bottom和Paging和SqlMethods 35 Top/Bottom操作 35 Take 35 Skip 35 TakeWhile 36 SkipWhile 36 Paging(分页)操作 36 1.索引 36 2.按唯一键排序 36 SqlMethods操作 37 Like 37 已编译查 询操作(Compiled Query) 38 LINQ to SQL语句(10)之Insert 38 插入(Insert)1.简单形式 38 2.一对多 关系 39 3.多对多关系 39 4.使用动态CUD重写(Override using Dynamic CUD) 40 LINQ to SQL语句(11)之Update 41 更新(Update) 41 1.简单形式 41 2.多项更改 41 LINQ to SQL语句(12)之Delete和使用Attach 42 删除(Delete)1.简单形式 42 2.一对多关系 42 3.推理删除(Inferred Delete) 43 使用Attach更新(Update with Attach) 43 LINQ to SQL语句(13)之开放式并发控制和事务 46 Simultaneous Changes开放式并发控制 46 开放式并发(Optimistic Concurrency) 46 1.Implicit(隐式) 48 2.Explicit(显式) 48 LINQ to SQL语句(14)之Null语义和DateTime 49 Null语义 49 1.Null 49 2.Nullable<T>.HasValue 50 日期函数 50 1.DateTime.Year 51 2.DateTime.Month 51 3.DateTime.Day 51 LINQ to SQL语句(15)之String 51 字符串(String) 51 1.字符 串串联(String Concatenation) 52 2.String.Length 52 3.String.Contains(substring) 52 4.String.IndexOf(substring) 52 5.String.StartsWith (prefix) 53 6.String.EndsWith(suffix) 53 7.String.Substring(start) 53 8.String.Substring (start, length) 53 9.String.ToUpper() 54 10.String.ToLower() 54 11.String.Trim() 54 12.String.Insert(pos, str) 54 13.String.Remove(start) 55 14.String.Remove(start, length) 55 15.String.Replace(find, replace) 55 LINQ to SQL语句(16)之对象标识 56 对象标识 56 对象缓存 56 LINQ to SQL语句(17)之对象加载 57 对象加载延迟加载 57 预先加载:LoadWith 方法 58 LINQ to SQL语句(18)之运算符转换 59 1.AsEnumerable:将类型转换为泛型 IEnumerable 59 2.ToArray:将序列转换为数组 59 3.ToList:将序列转换为 泛型列表 59 4.ToDictionary:将序 列转化为字典 60 LINQ to SQL语句(19)之ADO.NET与LINQ to SQL 60 1.连接 61 2.事务 61 LINQ to SQL语句(20)之存储过程 63 1.标量返回 63 2.单一结 果集 64 3.多个可 能形状的单一结果集 65 4.多个结果集 70 5.带输出参数 79 LINQ to SQL语句(21)之用户定义函数 80 1.在Select中使用用户定义的标量函数 80 2.在Where从句中 使用用户定义的标量函数 81 3.使用用户定义的表值函数 83 4.以联接方式使用用户定义的表值函数 84 LINQ to SQL语句(22)之DataContext 85 创建和删除数据库 85 数据库验证 88 数据库更改 88 动态查询 89 日志 90 LINQ to SQL语句(23)之动态查询 90 1.Select 91 2.Where 92 LINQ to SQL语句(24)之视图 94 LINQ to SQL语句(25)之继承 96 1.一般形式 97 2.OfType形式 98 3.IS形式 98 4.AS形式 99 5.Cast形式 99 6.UseAsDefault形式 100 7.插入新的记录 101
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨幂等

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值