本页内容:

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. 主机可以ping通虚拟机,虚拟机ping不通主机和外网

    vmware-->编辑-->虚拟网络编辑器-->更改配置,如下图选择:

  2. SpringBoot 跨域 Access-Control-Allow-Origin

    跨域(CORS)是指不同域名之间相互访问. 跨域,指的是浏览器不能执行其他网站的脚本,它是由浏览器的同源策略所造成的,是浏览器对于JavaScript所定义的安全限制策略. 只要协议,子域名,主域名, ...

  3. 【神经网络与深度学习】【计算机视觉】SPPNet-引入空间金字塔池化改进RCNN

    转自: https://zhuanlan.zhihu.com/p/24774302?refer=xiaoleimlnote 继续总结一下RCNN系列.上篇RCNN- 将CNN引入目标检测的开山之作 介 ...

  4. oracle创建用户并指定表空间

    /*第1步:创建ODPS数据表空间 */create tablespace ODPS logging datafile '/home/oracle/tablespace_dir/ODPS.dbf' s ...

  5. Ansible-Hoc--样例

    一.常用场景 1. 列出支持的模块及模块功能说明: 2. sudo用法: 3. 检查服务器存活,复制本地文件到远程: 4. 多线程判断服务器的存活: 5.  显示所有主机的hostname: 6. 列 ...

  6. SpringBoot2+Druid+MyBatis+MySql实现增删改查

    1.配置pom.xml文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...

  7. k8s 使用本地镜像的时候

    k8s默认会从远端拉取镜像,其配置参数imagePullPolicy为Always containers: - name: demo image: image imagePullPolicy: Nev ...

  8. Gevent模块,协程应用

    Gevent官网文档地址:http://www.gevent.org/contents.html 进程.线程.协程区分 我们通常所说的协程Coroutine其实是corporate routine的缩 ...

  9. VueJS中学习使用Vuex详解

    转载自:https://segmentfault.com/a/1190000015782272,做了部分修改(这里建议不要用所谓的getters,一来多次一举,二来模块化时会产生很不协调的用法) 在S ...

  10. C++中的虚函数以及虚函数表

    一.虚函数的定义 被virtual关键字修饰的成员函数,目的是为了实现多态 ps: 关于多态[接口和实现分离,父类指针指向子类的实例,然后通过父类指针调用子类的成员函数,这样可以让父类指针拥有多种形态 ...