本页内容:

1.LINQ查询语言的组成部分;

2.使用LINQ方法语法;

3.排序查询结果 orderby 字句;

4.聚合运算符;

5.查询复杂对象;

6.投影:在查询中创建新对象;

7.Distinct()、Any()、All()、First()、FirtOrDefault()、Take()、Skip()运算符;

8.组合查询

9.集运算符

10.联合 Join运算符

1.LINQ查询语言的组成部分

static void Main(string[] args)
{
string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe", "Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba", "Fatimah" }; var queryResults=from n in names
where n.StartsWith("S")
select n;
Console.WriteLine("Names beginning with S:");
foreach (var item in queryResults)
{
Console.WriteLine(item);
} Console.ReadLine();
}

该例子使用了LINQ查询语法声明了一个LINQ查询

            var queryResults=from n in names
where n.StartsWith("S")
select n;

该语句包括以下几个组成部分:

1.1 声明查询结果变量 var queryResults=;

1.2指定数据源 from n in names ;

1.3指定条件 where n.StartsWith("S");

1.4指定查询元素 select n;

注:LINQ是延迟执行的,它是在实际使用时执行的,不是在声明的时候执行的,查询结果变量queryResults只是保存了一个查询计划。本例中是在foreach循环时执行LINQ查询的。

2.使用LINQ方法语法

使用LINQ查询有多种方式,可以使用LINQ查询语法,如上例,也可以使用LINQ方法语法,也称显式语法。查询语法是LINQ查询的首选方式,因为查询语法比较通俗易懂,但是也需要用到方法语法,因为一些LINQ功能不能通过查询语法来查询,如聚合运算符。

        static void Main(string[] args)
{
string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe", "Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba", "Fatimah" }; var queryResults=names.Where(n=> n.StartsWith("S")); Console.WriteLine("Names beginning with S:");
foreach (var item in queryResults)
{
Console.WriteLine(item);
} Console.ReadLine();
}

使用LINQ方法语法只需要调用对应的方法即可,这个方法需要传送一个匿名方法作为参数,一般使用lamabda表达式创建匿名方法。

3.排序查询结果 orderby 字句

可以使用orderby 子句对查询结果进行排序,如下对结果按字母对名字进行升序排序

        static void Main(string[] args)
{
string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe", "Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba", "Fatimah" }; var queryResults=from n in names
where n.StartsWith("S")
orderby n
select n;
Console.WriteLine("Names beginning with S:");
foreach (var item in queryResults)
{
Console.WriteLine(item);
} Console.ReadLine();
}

orderby子句可以按照任意表达式对结果进行排序,如按照按照名字最后一个字母排序 orderby n.Substring(n.Length-1)

orderby默认升序排序,如果要降序排序可以添加descending关键字 orderby n descending

用方法语法排序

        static void Main(string[] args)
{
string[] names = { "Alonso", "Zheng", "Smith", "Jones", "Smythe", "Small", "Ruiz", "Hsieh", "Jorgenson", "Ilyich", "Singh", "Samba", "Fatimah" }; var queryResults = names.Where(n => n.StartsWith("s")).OrderBy(n => n);
Console.WriteLine("Names beginning with S:");
foreach (var item in queryResults)
{
Console.WriteLine(item);
} Console.ReadLine();
}

给元素按降序排序可以使用OrderByDescending

var queryResults = names.Where(n => n.StartsWith("s")).OrderByDescending(n => n.Substring(n.Length-1));

多级排序

有时候需用用到多个字段来进行排序,比如按照销量降序,国家升序,城市降序,就需要联合使用OrderBy\OrderByDescending和ThenBy/ThenByDescending

var queryResult = customers .OrderByDescending(n=>n.Sales).ThenBy(n=>n.Country).ThenByDescending(n=>n.City);

4.聚合运算符

        static void Main(string[] args)
{
int[] numbers = GenerateLotsOfNumbers(); var queryResults = from n in numbers
where n >
select n;
Console.WriteLine("Count of numbers >1000:"+queryResults.Count());
Console.WriteLine("Max of numbers >1000:" + queryResults.Max());
Console.WriteLine("Min of numbers >1000:" + queryResults.Min());
Console.WriteLine("Average of numbers >1000:" + queryResults.Average());
Console.WriteLine("Sum of numbers >1000:" + queryResults.Sum(n=>(long)n));//必须转换为long,因为sum太大超过了int存储的范围
Console.ReadLine();
}

使用聚合运算符在不进行循环的情况下分析结果,特别是对数字类型的结果特别有用。

5.查询复杂对象

上面的例子中查询的对象都是数字,字符串等简单类型,也可以使用LINQ查询对象等复杂数据类型

    public class Customer
{
public string ID { get; set; }
public string City { get; set; }
public string Country { get; set; }
public string Region { get; set; }
public decimal Sales { get; set; } public override string ToString()
{
return "ID:" + ID + ",City:" + City + ",Country:" + Country + ",Region:" + Region + ",Sales:"+Sales;
}
} static void Main(string[] args)
{
List<Customer> customers = new List<Customer> {
new Customer {ID="A" ,City ="New York" ,Country ="USA", Region="North America", Sales =},
new Customer {ID="B" ,City ="Munbai" ,Country ="India", Region="Asia", Sales =},
new Customer {ID="C" ,City ="Karachi" ,Country ="Pakistan", Region="Asia", Sales =},
new Customer {ID="D" ,City ="Delhi" ,Country ="India", Region="Asia", Sales =},
new Customer {ID="E" ,City ="S o Paulo" ,Country ="Brazil", Region="South America", Sales =},
}; var queryResults = from n in customers
where n.Region == "Asia"
select n;
Console.WriteLine("Customers in Asin:");
foreach (var item in queryResults)
Console.WriteLine(item);
Console.ReadLine();
}

6.投影:在查询中创建新对象

投影(Projection)是在LINQ查询中从其他数据类型创建新数据类型的技术术语,select关键字是投影运算符

    public class Customer
{
public string ID { get; set; }
public string City { get; set; }
public string Country { get; set; }
public string Region { get; set; }
public decimal Sales { get; set; } //public override string ToString()
//{
// return "ID:" + ID + ",City:" + City + ",Country:" + Country + ",Region:" + Region + ",Sales:"+Sales;
//}
} static void Main(string[] args)
{
List<Customer> customers = new List<Customer> {
new Customer {ID="A" ,City ="New York" ,Country ="USA", Region="North America", Sales =},
new Customer {ID="B" ,City ="Munbai" ,Country ="India", Region="Asia", Sales =},
new Customer {ID="C" ,City ="Karachi" ,Country ="Pakistan", Region="Asia", Sales =},
new Customer {ID="D" ,City ="Delhi" ,Country ="India", Region="Asia", Sales =},
new Customer {ID="E" ,City ="S o Paulo" ,Country ="Brazil", Region="South America", Sales =},
}; var queryResults = from n in customers
where n.Region == "Asia"
select new { n.Region , n.Country ,n.City ,n.Sales };
Console.WriteLine("Customers in Asin:");
foreach (var item in queryResults)
Console.WriteLine(item);
Console.ReadLine();
}

投影创建的匿名类型不用提供ToString重新方法,因为编译器提供了默认的重新方法,以名值对的方式输出对象(正常类如果不重写Tostring方法输出的是类名,如ConsoleApplication1.Customer)

7.Distinct()、Any()、All()、First()、FirtOrDefault()、Take()、Skip()运算符

Distinct()和SQL distinct一样返回数据集中的唯一值

            var queryResult = customers.Select(n=>n.Region).Distinct();
var queryResult2 = customers.Select(n =>new {n.Country,n.City }).Distinct();

Any()检查数据集是否有任何一个元素满足条件,如果有返回true,没有返回false;All()检查数据集是否所有元素都符合条件

            bool anyUSA = customers.Any(n=>n.Country=="UAS");
var allAsia = customers.All(n=>n.Region =="Asia");

First()返回数据集第一个满足条件的元素,如果没有符合条件的元素将抛出异常;FirstOrDefault()返回满足条件的第一个元素,与First不同的是如果没有符合条件的元素返回空,不会抛出异常

            //查询语法
var queryResult=(from n in customers select n).First(n => n.Country == "USA");//查询语法和方法语法混用 //方法语法
var customerUSA = customers.First(n => n.Country == "USA");
var customerAsia = customers.FirstOrDefault(n => n.Region == "Asia");

take()取结果集前N条,skip()略过前N条取剩余的

            var salesTop3 = customers.OrderByDescending(n=>n.Sales).Take();
var salesLeft = customers.OrderByDescending(n => n.Sales).Skip();

 8.组合查询

组合查询类似SQL group by,允许把数据分组,按组来排序,计算聚合值和进行比较。

            var queryResult = from n in customers
group n by n.Region into cg
select new { TotalSales = cg.Sum(c => c.Sales), Region = cg.Key }; var orderResult = from cg in queryResult
orderby cg.TotalSales descending
select cg;

9.集运算符

使用集运算符,可以快速的对两个结果集进行操作。集运算符要求集成员有相同的类型,才能得到希望的结果

    public class Customer
{
public string ID { get; set; }
public string City { get; set; }
public string Country { get; set; }
public string Region { get; set; }
public decimal Sales { get; set; } public override string ToString()
{
return "ID:" + ID + ",City:" + City + ",Country:" + Country + ",Region:" + Region + ",Sales:" + Sales;
}
} public class Order
{
public string ID { get; set; }
public decimal Amount { get; set; }
}
            List<Customer> customers = new List<Customer> {
new Customer {ID="A" ,City ="New York" ,Country ="USA", Region="North America", Sales =},
new Customer {ID="B" ,City ="Munbai" ,Country ="India", Region="Asia", Sales =},
new Customer {ID="C" ,City ="Karachi" ,Country ="Pakistan", Region="Asia", Sales =},
new Customer {ID="D" ,City ="Delhi" ,Country ="India", Region="Asia", Sales =},
new Customer {ID="E" ,City ="S o Paulo" ,Country ="Brazil", Region="South America", Sales =},
}; List<Order> orders = new List<Order>
{
new Order {ID ="A",Amount=},
new Order {ID ="B",Amount=},
new Order {ID ="F",Amount=},
}; var customerIds = from n in customers select n.ID;
var orderIds = from n in orders select n.ID; //有订单的客户ID
var customerWithOrders= customerIds .Intersect(orderIds); //没有客户的订单
var ordersNoCustomers = orderIds.Except(customerIds); //客户和订单的ID集合
var allCustomersOrdersIds = customerIds.Union(orderIds);

10.联合 Join运算符

Join运算符类似SQL Join操作,可以把两个数据集用关键字段连接起来。

            var queryResult = from n in customers
join o in orders on n.ID equals o.ID
select new { n.ID ,n.City ,SaleBefore=n.Sales ,OrderAmount=o.Amount ,SaleAfter=n.Sales +o.Amount };

29.LINQ初探的更多相关文章

  1. Linq初探

    1.什么是LINQ LINQ是语言集成查询(Language Integrated Query),这项技术是在.net 3.5就已经引入的技术,极大的方便了数据的查询,他可以支持数据库.XML.ADO ...

  2. LINQ_to_SQL语法及实例大全

    LINQ To SQL 语法及实例大全 2011/4/5 目录 LINQ to SQL语句(1)之Where. 2 Where操作... 2 1.简单形式:... 2 2.关系条件形式:... 2 3 ...

  3. 编写高质量代码改善C#程序的157个建议——建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T>

    建议29:区别LINQ查询中的IEnumerable<T>和IQueryable<T> LINQ查询一共提供了两类扩展方法,在System.Linq命名空间下,有两个静态类:E ...

  4. C#学习笔记(29)——Linq的实现,Lambda求偶数和水仙花数

    说明(2017-11-22 18:15:48): 1. Lambda表达式里面用了匿名委托,感觉理解起来还是挺难的.求偶数的例子模拟了Linq查询里的一个where方法. 2. 蒋坤说求水仙花数那个例 ...

  5. Linq To Sql 使用初探

    最近有数据处理需要,就是那种从数据库中把数据取出来 ,对其中的部分字段做一些处理再吐回去的工作,从同事那里学习到了,这中活最适合使用 Linq to Sql 这种方式,不用搭建框架,不用自建实体,直接 ...

  6. MVC的验证(模型注解和非侵入式脚本的结合使用) .Net中初探Redis .net通过代码发送邮件 Log4net (Log for .net) 使用GDI技术创建ASP.NET验证码 Razor模板引擎 (RazorEngine) .Net程序员应该掌握的正则表达式

    MVC的验证(模型注解和非侵入式脚本的结合使用)   @HtmlHrlper方式创建的标签,会自动生成一些属性,其中一些属性就是关于验证 如图示例: 模型注解 通过模型注解后,MVC的验证,包括前台客 ...

  7. 【手把手教你全文检索】Apache Lucene初探

    PS: 苦学一周全文检索,由原来的搜索小白,到初次涉猎,感觉每门技术都博大精深,其中精髓亦是不可一日而语.那小博猪就简单介绍一下这一周的学习历程,仅供各位程序猿们参考,这其中不涉及任何私密话题,因此也 ...

  8. Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用

    一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...

  9. C#进阶系列——DDD领域驱动设计初探(三):仓储Repository(下)

    前言:上篇介绍了下仓储的代码架构示例以及简单分析了仓储了使用优势.本章还是继续来完善下仓储的设计.上章说了,仓储的最主要作用的分离领域层和具体的技术架构,使得领域层更加专注领域逻辑.那么涉及到具体的实 ...

随机推荐

  1. Linq查询连接guid与varchar字段

    使用场景 在数据库设计中进场会出现一些通用表,如通用附件表,一般都是通过ForeignTable(关联的表名)和ForeignKey(关联表的主键)与其他表关联.这样的表在数据库中没有外键关系,而且一 ...

  2. iOS @功能的部分实现思路

    需求描述 1. 发布信息时,通过键盘键入@符号,或者点选相关功能键,唤醒@列表,进行选择 2.选择结束后,输入栏改色显示相关内容 3.删除时,整体删除@区块,且不能让光标落在@区块之间 实现步骤 1. ...

  3. Java中BIO,NIO,AIO的理解

    在高性能的I/O体系设计中,有几个概念常常会使我们感到迷惑不解.具体如下: 1 什么是同步? 2 什么是异步? 3 什么是阻塞? 4 什么是非阻塞? 5 什么是同步阻塞? 6 什么是同步非阻塞? 7  ...

  4. 经典例题(Python)

    经典例题 if嵌套 1.用户输入账号2.用户输入密码3.判断用户的账号是不是alex4.如果账号是alex在继续判断密码是不是alexdsb5.账号和密码都正确提示用户alex就是一个dsb6.如果账 ...

  5. Django框架深入了解_04(DRF之url控制、解析器、响应器、版本控制、分页)

    一.url控制 基本路由写法:最常用 from django.conf.urls import url from django.contrib import admin from app01 impo ...

  6. pandas中的axis参数(看其他人的博客中产生的疑问点,用自己的话解析出来)

    axis有两个值:axis=0或者axis=1 看到很多资料都不太理解,把我个人理解说一下: 下面这张图,在很多资料中都看到了,我只能说先死记住 axis=0,代表跨行(注意看这张图的axis=0的箭 ...

  7. Nginx 添加模块

    说明: 已经安装好的Nginx,需要添加一个未被编译安装的模块(以nginx-rtmp-module模块为例),则需要重新编译nginx nginx的模块是需要重新编译nginx,而不是像apache ...

  8. jwt 0.9.0(三)jwt客户端存储状态可行性分析,及Java代码案例

    Jwt客户端存储状态可行性分析 1.前端首次访问后台,后台生成token,放在http header的Authorization里(官网推荐,可解决跨域cookie跨域问题),并且Authorizat ...

  9. Java 哈希表

    public int firstUniqChar(String s){ int[] freq=new int[26]; for(int i=0;i<s.length();i++){ freq[s ...

  10. SocketException: Write failed (OS Error: Broken pipe, errno = 32

    https://github.com/flutter/flutter/issues/16491