LINQ之Select、Distinct

来源:互联网 发布:学好javascript 编辑:程序博客网 时间:2024/05/16 19:27

上一篇讲述了LINQ,顺便说了一下Where操作,这篇开始我们继续说LINQ to SQL语句,目的让大家从语句的角度了解LINQ,LINQ包括LINQ to Objects、LINQ to DataSets、LINQ to SQL、LINQ to Entities、LINQ to XML,但是相对来说LINQ to SQL在我们程序中使用最多,毕竟所有的数据都要在数据库运行着各种操作。所以先来学习LINQ to SQL,其它的都差不多了,那么就从Select说起吧,这个在编写程序中也最为常用。本篇详细说明一下Select和Count/Sum/Min/Max/Avg。

Select/Distinct操作符

适用场景:o(∩_∩)o… 查询呗。

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

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

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方法如下:

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

9.Distinct形式:

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

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

语句描述:查询顾客覆盖的国家。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 8个月不吃辅食怎么办 宝宝不吃药怎么办一岁 奶水不足宝宝又不吃奶粉怎么办 一岁婴儿突然不吃饭怎么办 一岁宝宝突然不吃饭怎么办 一岁半宝宝突然不爱吃饭怎么办 1岁宝宝突然不爱吃饭怎么办 一岁多宝宝突然不爱吃饭怎么办 一岁半宝宝突然不吃饭怎么办 八个月宝宝不吃奶粉怎么办 小孩铅超标怎么办如何排铅 宝宝突然不吃辅食怎么办 6个月宝宝不喝奶怎么办 宝宝4月不吃母乳怎么办 不吃母乳怎么办 8个月 宝宝不吃奶粉母乳又不够怎么办 宝宝只吃母乳不吃奶粉怎么办 十个月宝宝不爱吃辅食怎么办 奶水不足宝宝不吃奶粉怎么办 两个月宝宝不吃奶瓶怎么办 宝宝拉的有鼻涕怎么办 七个月宝宝拉肚子拉水怎么办 十个月宝宝拉肚子拉水怎么办 一个月宝宝拉肚子拉水怎么办 五个月的宝宝拉肚子还拉水怎么办 4岁宝宝拉肚子怎么办拉水样 刚出生的婴儿呕奶怎么办 8岁儿童腹泻呕吐怎么办 一岁宝宝呕吐腹泻怎么办 5岁儿童腹泻呕吐怎么办 4岁宝宝呕吐腹泻怎么办 7岁儿童腹泻呕吐怎么办 一个月婴儿呕奶怎么办 一个月婴儿呕奶严重怎么办 6岁宝宝大便干燥怎么办 3岁儿童干咳嗽怎么办 3岁宝宝一直咳嗽怎么办 3岁宝宝风寒咳嗽怎么办 刚出生的宝宝拉奶瓣怎么办 小孩拉痢疾带血怎么办 2岁宝宝有点拉稀怎么办