LINQ能够解决的问题
.NET平台开发中一直存在的情况:
-
面向对象编程语言与数据库访问方法长期分离,以嵌入式方式开发
嵌入式SQL语句没有任何提示,很容易出错
-
编程语言中的数据类型与数据库中的数据类型完全是两套体系
例如:C#中字符串string在SQL中使用varchar/Nvarchar/char来表示
-
SQL和XML都有各自的查询语言,而对象没有自己的查询语言
例如:要从一个List< T>集合或者数组中找到符合要求的元素非常困难。
LINQ查询重点解决以上问题
LINQ是什么
LINQ(Language Integrated Query)
语言集成查询
-
是微软公司提供的一项新技术,能够将查询功能直接引入到C#、VB.NET等编程语言中
-
查询操作可以通过编程语言自身来表示,而不是嵌入字符串SQL语句
LINQ的组成
-
LINQ to Objects 主要负责对象的查询
-
LINQ to XML 主要负责XML的查询
-
LINQ to ADO.NET 主要负责数据库的查询
-
LINQ to SQL (目前已经没人使用)
-
LINQ to DataSet
-
LINQ to Entities (重点学习)
-
LINQ的命名空间
-
System.Linq;该命名空间已经由系统自动引入
-
因此微软默认建议多使用Linq技术查询
LINQ的组成架构
不采用LINQ技术的查询
static void Main(string[] args)
{
//1.从数组中拿到所有的偶数
int[] nums = { 1, 22,18,2, 3, 5, 7, 6, 8, 9, 23, 12 };
List<int> list = new List<int>();
foreach (int item in nums)
{
if (item%2==0)
{
list.Add(item);
}
}
list.Sort();
list.Reverse();
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(list[i]);
}
Console.ReadLine();
}
采用LINQ技术进行查询
int[] nums = { 1, 22, 18, 2, 3, 5, 7, 6, 8, 9, 23, 12 };
var list = from item in nums
where item % 2 == 0
orderby item descending
select item;
foreach (var item in list)
{
Console.WriteLine(item);
}
LINQ查询方法
获取数据方法
扩展方法:Select()
-
Select()是一个泛型扩展方法
-
Select()方法使用的时候,要求传递一个委托实例(委托实例就是一个方法)
Select()方法应用
int[] nums = { 1, 22, 18, 2, 3, 5, 7, 6, 8, 9, 23, 12 };
var list = nums.Select(item=>item*2);
foreach (var item in list)
{
Console.WriteLine(item);
}
-
Select()方法里面是一个Lambda表达式
-
返回结果是一个迭代[隐式循环]器(Iterator)
-
不论数组还是集合都可以使用Select()扩展方法
筛选数据方法
扩展方法:Where()
-
Where()方法是一个扩展泛型方法
-
Where()方法使用的时候要求传递一个委托实例,但该实例是一个判断条件,因此返回的类型必须是bool类型
Where()方法应用
var list = nums.Where(item => item % 2 != 0).Select(item=>item*2);
foreach (var item in list)
{
Console.WriteLine(item);
}
“链式编程”:在一个方法完成之后可以继续紧接着调用方法
注意:链式编程在每个环节之后能否继续链式要考虑这个环节的结果是否是集合
排序数据方法
扩展方法:OrderBy()
-
OrderBy()是一个扩展方法
-
OrderBy()里面的参数要求传递一个排序字段,默认按照升序排序
-
如果需要降序排列可以使用OrderByDescending方法
OrderBy()方法应用
var list = nums.Where(item => item % 2 == 0)
.Select(item => item * 2)
.OrderBy(item=>item);
foreach (var item in list)
{
Console.WriteLine(item);
}
string[] arry = { "张三","李四","王五","赵六","陈七","宋八","杜九"};
var list = arry.Select(item => item).OrderBy(item => item.Substring(1,1));
foreach (var item in list)
{
Console.WriteLine(item);
}
分组数据方法
扩展噶GroupBy()
-
GroupBy()是一个扩展方法
-
GroupBy()里面的参数要求传递一个分组字段
GroupBy()方法应用
var list = arry.Select(item => item).GroupBy(item => item.Substring(0, 1));
foreach (var item in list)
{
Console.WriteLine("---------------------------");
Console.WriteLine("分组字段:" + item.Key);
foreach (var i in item)
{
Console.WriteLine(i);
}
}