Linq入门篇
linq是语言集成查询,是在framework中增加的创新,他在对象领域和数据领域架起了一座桥梁。
linq支持的数据源:ADO.NET dataSet.
XML文档
SQL SERVER数据源
支持IEnumberable或者泛型IEnumberable(T)接口的任意对象集合。
Linq查询步骤:
获取数据源
创建查询
执行查询
数据源:想要使用linq惊醒查询,数据源必须支持IEnumberable或者IEnumberable(T)泛型接口或者派生接口。
查询:查询指定从数据源中检索的信息。
查询还可以指定在返回这些信息之前如何对其进行排序,分组和结构化。
查询存储在查询变量中,并用查询变量进行初始化。
查询执行:
查询变量本身只是存储查询命令。实际的查询执行会延迟在foreach语句中循环访问变量时发生。此概念成为延时执行。
强制立即执行,可以通过以下两个方法,使得linq立即执行。
执行聚合函数(Count,Max,Average,First)
调用Tolist(
from子句 用户获取数据源
查询表达式必须以from子句开头
使用let子句扩展范围变量
static void Main(string[] args)
{
string[] strings = {
"I am a new Studnet",
"You are a talent"
};
var query = from sentences in strings
let words = sentences.Split(' ')
from word in words
let w = word.ToLower()
where w[0] == 'a' || w[0] == 'e' || w[0] == 'i' || w[0] == 'o' || w[0] == 'u'
select word;
foreach (var word in query)
{
Console.WriteLine(word + ",");
}
}
需求:将字符串数组中的两句英文语句中所有的元音字母打头的单词输出到控制台
分析:首先遍历字符串数组中的每个字符串,用let子句创建查询自身的范围变量words,并调用Split(' ')方法,将每个字符串中以空格分割为单词存入words变量中,然后再次使用let子句创建查询自身的范围变量word,并调用ToLower()方法,将每个单词都变为小写,最后筛选出首字母为元音的单词进行返回
where子句:
将一个布尔条件应用与每个源元素,并返回满足指定条件的元素。
static void Main(string[] args)
{
int[] arr = { 0, 3, 2, 1, 9, 6, 8, 7, 4, 5 };
//使用where子句查询语句
var query = from a in arr
where a < 5 && a % 2 == 0
select a;
foreach (var a in query)
{
Console.WriteLine(a);
}
Console.ReadKey();
//将数组中小于5的偶数查询出来输出到控制台
}
where表达式不仅可以使用表达式,还可以使用方法。
static void Main(string[] args)
{
int[] arr = { 0, 3, 2, 1, 9, 6, 8, 7, 4, 5 };
var query = from a in arr
where isEven(a)
select a;
foreach (var a in query)
{
Console.WriteLine(a);
}
Console.ReadKey();
}
public static bool isEven(int a)
{
return a % 2 == 0 ? true : false;
}
使用where子句要注意几点:
1. 一个查询表达式可以包含多个where子句。
2.where子句是一个筛选机制,除了不能是第一个或者最后一个子句外,他几乎可以放在表达式的任何位置,where子句也可以出现在group子句的前面或者后面。
3.如果指定谓词对数据源中的元素无效,则会发生编译错误。这是linq提供强类型检查的一个优点。
order by 子句
1.对查询出来的结果集进行升序或者降序排列。
2.可以指定多个键,以便执行一次或者多次排序操作。
3.默认排序是升序。
static void Main(string[] args)
{
int[] arr = { 0, 3, 2, 1, 9, 6, 8, 7, 4, 5 };
var query = from a in arr
where isEven(a)
//orderby a ascending //升序
orderby a descending //降序
select a;
foreach (var a in query)
{
Console.WriteLine(a);
}
Console.ReadKey();
}
public static bool isEven(int a)
{
return a % 2 == 0 ? true : false;
}
static void Main(string[] args)
{
//数据源
string[] fruits = {"apple","bnana","peach","orange","melon","lemon"};
//分组查询的查询语句
var query = from f in fruits
group f by f[0];
//根据首字母进行分组
foreach (var item in query)
{
Console.WriteLine("以字母开头的单词"+item.Key);
foreach (var word in item)
{
Console.WriteLine(word);
}
}
}
equals关键字
join子句执行同等连接。只能基于两个键之间的关系进行匹配。
为了表明所有连接都是同等连接,json子句使用equals关键字而不是==运算符。
Linq表达式 LINQ join连接
内部连接:按照关系数据库的说法,内部连接产生一个结果集,对于第一个集合中的所有元素,只要第二个集合存在一个匹配元素,该元素就会出现一次。如果第一个集合中某个元素没有匹配的元素,则他不会出现在结果集内。