时间挺快,转眼10月间,最近都一直挺忙,无太多时间来更新,今天带来在工作中用到C#的linq一些高级查询表达式,会慢慢从浅薄更新到高级操作。
【1】概述
LINQ的全称是Language Integrated Query,中文译成“语言集成查询”。LINQ作为一种查询技术,首先要解决数据源的封装,大致使用了三大组件来实现这个封装,分别是LINQ to Object、LINQ to ADO.NET、LINQ to XML,我们主要讲解LINQ to Object,其它的可以参考官网。
Linq的数据源要求必须实现IEnumerable或IEnumerable接口,创建一个LINQ表达式必须要以from子句开头。
第一个姿势: 单个from
// //linq 查询由3基本部分组成如下 // // //1.数据源 List data = new List() { 1, 5, 18, 17, 13, 9, 8, 14, 15 }; //2.创建查询 var query = from n in data where n > 8 select n; //3.执行 foreach (var n in query) { Console.WriteLine(n); }
在上面的LINQ表达式的from子句中,n叫做范围变量,data 是数据源,n的作用域存在于当前的LINQ表达式,表达式以外不能访问这个变量。where用来筛选元素,select用于输出元素。这里的范围变量n,和foreach语句中的隐式变量n都可以由编译器推断出其类型。
对象的使用:
public class Emp { public string Name { get; set; } public int Age { get; set; } public string Tel { get; set; } } static void Main(string[] args) { //对象的使用 List Emps = new List { new Emp{ Name="Mcally", Age=26, Tel ="1330708****"}, new Emp{ Name="Jack", Age=17, Tel ="1592842****"}, new Emp{ Name="King", Age=23, Tel ="1380524****"} }; //查询年龄大于20的员工 var query = from emp in Emps where emp.Age > 20 select emp; foreach (Emp e in query) { Console.WriteLine("姓名:{0} 年龄:{1} 电话:{2}", e.Name, e.Age, e.Tel); }
第二个姿势:复合form
public class Emp { public string Name { get; set; } public int Age { get; set; } public List TelTable { get; set; } } static void Main(string[] args) { List emps = new List { new Emp{ Name="Tom", Age=35, TelTable=new List{"1330708****","1330709****"}}, new Emp{ Name="Ben", Age=17, TelTable=new List{"1592842****","1592843****"}}, new Emp{ Name="Lin", Age=23, TelTable=new List{"1380524****","1380525****"}} }; //查询包含电话号码1592842****的员工 var query = from Emp ci in emps from tel in ci.TelTable where tel.IndexOf("1592842****") > -1 select ci; foreach (var ci in query) { Console.WriteLine("姓名:{0} 年龄:{1}", ci.Name, ci.Age); foreach (var tel in ci.TelTable) { Console.WriteLine("电话:{0}", tel); } }
第三姿势:多个form
static void Main(string[] args) { List eone = new List { new Emp{ Name="Ping", Age=35, Tel ="1330708****"}, new Emp{ Name="Jing", Age=17, Tel ="1592842****"}, new Emp{ Name="Ling", Age=23, Tel ="1380524****"} }; List etwo = new List { new Emp{ Name="Hing", Age=10, Tel ="1330708****"}, new Emp{ Name="Qonn", Age=35, Tel ="1592842****"}, new Emp{ Name="Huuu", Age=23, Tel ="1380524****"} }; //在eone中查找Age大于20的客户, //在etwo中查找Age小于30的客户 var query = from e in eone where e.Age > 20 from e2 in etwo where e2.Age < 30 select new { e, e2 }; foreach (var ci in query) { Console.WriteLine("{0} {1}", ci.e.Name, ci.e2.Name); }
在select语句中,我们用了匿名类型来存储筛选出的元素,这样得到的完全是一个交叉联接表,有点类似于SQL中的笛卡尔乘积。
下次再继续更新,一点点介绍,当然还有更为简单的方式待后续更新。



