什么是LINQ?
集成查询语言
LINQ优点是什么?
1、可以对多种数据源和对象进行查询,如数据库、数据集、xml文档甚至是数组,这在传统的查询语句中是很难实现的。
2、和sql查询规则很相似,容易上手。
说明:
LINQ的全称:Language-Intergrated Query
命名空间:System.Linq;
Linq是.NET Framework3.5中出现的技术,所以在新建项目的时候必须选择3.5或更高版本。
选择3.5或更高版本.NET Framework3.5 之后创建类文件中就会自动包含System.Linq;的命名空间。
LINQ的基本格式:
var <变量>=from <项目> in <数据源> where <表达式> orderby <表达式>
1.数组
int[] inter={1,2,3,4,5,6,7,8,9};
var stInt=from s in inter where s>5 select s;//stInt就是大于5的数据集合
string[] str={"张三","李四","张小六","陈七","王五"};
var stStr=from l in str where l.Contains("张") select l;//stStr就是名字中包含‘张’的集合。
2.sqlserver
首先应该先创建一个LINQ to SQL类文件(直接将服务器资源管理器中相应表拖放到LINQ to SQL类文件可视化窗口即可),创建好后就可以直接使用LINQ to SQL类文件提供的类进行查询。
linqtosqlDataContext lq = new linqtosqlDataContext();
var mylq = from l in lq.Student from cl in lq.Class where l.C_id == cl.C_id select l;//查询Student表与Class表
3、数据集
SqlConnection con = new SqlConnection("server='(local)';database='student';uid='sa';pwd='sa'");//创建链接
con.Open();//打开链接
string strSql = "select * from student,class where student.C_id=class.C_id";//拼写sql
SqlDataAdapter da = new SqlDataAdapter(strSql,con);//创建适配器
DataSet ds = new DataSet();//创建数据集
da.Fill(ds,"myTable");//填充数据集
DataTable tables = ds.Tables["myTable"];//创建表
var dslq = from d in tables.AsEnumerable() select d;//执行linq语句
// 注意:LINQ 不能直接从数据集对象中查询,因为数据集对象不支持LINQ查询,需要使用ASEnumerable方法返回一个泛型的对象以支持LINQ的查询操作。
---------------------------------------------------------------------------------------------------------------------------------
where子句
int[] inter={1,2,3,4,5,6,7,8,9};
var stInt=from s in inter where s>5 select s;--stInt就是大于5的数据集合
返回元素类型为IGrouping
public class Person
{
public int age;
public string name;
public int cid;
public Person(int age, string name, int cid)
{
this.age = age;
this.name = name;
this.cid = cid;
}
}
public class CarInformaion
{
public int cid;
public string type;
public CarInformaion(int cid, string type)
{
this.cid = cid;
this.type = type;
}
}
List personList = new List();
personList.Add(new Person(11, "zhangsan",1));
personList.Add(new Person(11, "lisi",2));
personList.Add(new Person(16, "wangwu",1));
personList.Add(new Person(12, "zhaoliu",3));
personList.Add(new Person(16, "lala",3));
List listcar = new List();
listcar.Add(new CarInformaion(1,"尼桑"));
listcar.Add(new CarInformaion(2, "宝马"));
listcar.Add(new CarInformaion(3, "奥迪"));
==================================================================================================
var gl = from p in personList group p by p.age;//根据age分组
注意:因为group子句返回的元素类型是IGroupingforeach(var element in gl){
foreach(Person p in element){
// p.name; p.age;
}}
var gl = from p in personList orderby p.age select p;//默认是升序 ascending, 降序descending
var gl = from p in personList orderby p.age descending select p;//降序排列
var gl = from p in personList orderby p.age descending,p.name select p;//也可根据多个条件进行排序,条件之间用“,”分隔
into子句通常和group子句一起使用。通常情况不需要into子句。对分组中的元素进行操作的时候需要使用into子句。
into语句能够创建临时标识符,用于保存查询的集合
var gl = from p in personList group p by p.age into x select x;//linq查询语句将查询的结果填充到了临时标识符对象x中,并返回查询集合给gl变量。
join连接子句
注意:1.首先两个数据源必须要有一定的联系。
var res = from p in personList join car in listcar on p.cid equals car.cid select p;
let可以说是一个临时的变量,用于保存表达式的结果,但是let子句指定的范围变量值,只能通过初始化进行赋值,一旦初始化之后就无法进行更改操作。
var gl = from p in personList let car = from c in listcar select c.cid select p;
let就相当于一个中转变量,用于临时存储表达式的值.如x=x+1、y=y+2....
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
C#的Lambda 表达式都使用 Lambda 运算符 =>,该运算符读为“goes to”。语法如下:
形参列表=>函数体
函数体多于一条语句的可用大括号括起。
可以将此表达式分配给委托类型,如下所示:delegate
int
del(
int
i);
del myDelegate = x => {
return
x * x; };
int
j = myDelegate(5);
//j = 25
----------------------------------------------------------------------
Count | 计算集合中元素数量,或满足条件的集合的元素数量 |
---|---|
GroupBy | 实现对集合中的元素进行分组操作。 |
Max | 获取集合中元素的最大值 |
Min | 获取集合中元素的最小值 |
Select | 执行投影操作 |
SelectMany | 执行投影操作,可以对多个数据源进行投影操作 |
Where | 执行筛选工作 |
select 选择子句
int[] inter = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14};
var lint = inter.Select(i=>i);//select 映射
foreach(var m in lint){
m.ToString();
}
上述代码将集合中的元素进行投影,并将符合条件的元素投影到新的集合中lint
selectMany 多重选择子句
int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; //创建数组
int[] inter2 = { 21, 22, 23, 24, 25, 26 };
List list = new List();
list.Add(inter);
list.Add(inter2);
var lint = list.Select(i => i);
foreach (var m in lint)
{
m.ToString();
}
上述代码将不同的数据源映射到一个新的集合中。
Where 筛选操作
int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; //创建数组
var lint = inter.Where(i=>i>5);
foreach(var a in lint){
Console.WriteLine(a.ToString());
}
// var lint = inter.Where(i=>i>5); 功能等同 var res = from l in inter where l > 5 select l;
orderBy
orderby | 根据关键字对集合中的元素按升序排列 |
orderbydescending | 根据关键字对集合中的元素按降序排列 |
thenby | 根据次要关键字,对集合中的元素进行升序排列 |
thenbydescending | 根据次要关键字,对集合中的元素进行降序排列 |
reverse | 将序列中的元素顺序进行反转 |
int[] inter = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; //创建数组
var lint = inter.OrderByDescending(i => i); //1.使用降序排列元素
var lint = inter.Reverse();//反转集合
count | 获取集合中元素的数量,或者获取满足条件的数量 |
sum | 获取集合中元素的总和 |
max | 获取集合中元素的最大值 |
min | 获取集合中元素的最小值 |
average | 获取集合中元素的平均值 |
aggregate | 对集合中的元素进行自定义的聚合计算 |
longCount | 获取集合中元素的数量,或计算序列满足一定条件的数量,一般计算大型集合中的 元素数量 |
int[] inter = { 20, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; //创建数组
var Maxlint = inter.Max(); //获取最大值
var Minlint = inter.Min(); //获取最小值
//上述并未使用lambda表达式,如果要写lambda表达式,如下代码所示
var Maxlint = inter.Max(i => i);//获取最大值
var Minlint = inter.Min(i => i);
var Countlint = inter.Count(i => i > 5);//获取大于5的元素数量
var Arrlint = inter.Average(i => i); //获取平均值
var aq = inter.Aggregate((x, y) => x + y); //使用自定义的Aggregate方法