:linq是什么?
linq可以理解为嵌入C#语法的强类型查询语言。(注意:尽管linq看起来和Sql查询很像,但语法却不相同。)
二:linq的作用?
提供一种统一且对称的方式,让程序员得到数据和操作数据(此处的数据可以是XML,DataSet,物理数据等)
查询数组
int[] arr = new int[] {5, 1, 9, 3, 4, 0, 8 };
var m = from item in arr
select item;
foreach (var item in m)
{
Response.Write(item.ToString() + "
");
}
结果:5
1
9
3
4
0
8
可以看出 LINQ 和 SQL 很像,两点不同:
select 在后面,这可能是受某些限制,只好把 select 放在后面。
from 与数据之间多了个“变量名 in”。
查询 List
System.Collections.Generic.Listarr = new System.Collections.Generic.List { 5, 1, 9, 3, 4, 0, 8 };
var m = from item in arr
select item;
foreach (var item in m)
{
Response.Write(item.ToString() + "
");
}
可以看出查询 List 与查询数组完全是一样的。另请参见 C# 3.0 -集合初始化设置。
查询
Dictionary
System.Collections.Generic.Dictionary
arr = new System.Collections.Generic.Dictionary ();
arr.Add(0, 5);
arr.Add(1, 1);
arr.Add(2, 9);
arr.Add(3, 3);
arr.Add(4, 4);
arr.Add(5, 0);
arr.Add(6, 8);
var m = from item in arr
select item;
foreach (var item in m)
{
Response.Write(item.Value.ToString() + "
");
}
我们可以发现在查询 Dictionary 时,查询语句是一样的,但输出时,不再是 item.ToString(),而是 item.Value.ToString(),并且我们在写完“item.”后,“Value”会自动出现 IntelliSense 中,不需要我们记忆。
返回时创建对象
string[] files = System.IO.Directory.GetFiles("C:");
var fis = from file in files
select new System.IO.FileInfo(file);
foreach (var fi in fis)
{
Response.Write(fi.Name + " " + fi.CreationTime.ToString() + "
");
}
上述先把 C: 下的文件放到 files 字符串数组中,然后在 LINQ 查询时,将其“包装”成 FileInfo 对象。注意这里使用了 var。
返回时创建匿名类型
int[] arr = new int[] { 5, 1, 9, 3, 4, 0, 8 };
var m = from item in arr
select new { a = item, b = item + 1 };
foreach (var item in m)
{
Response.Write(item.b.ToString() + "
");
}
使用 {},具体请参见 C# 3.0 -匿名类型。
使用 where、orderby
int[] arr = new int[] { 5, 1, 9, 3, 4, 0, 8 };
var m = from item in arr
where item > 3
orderby item descending
select item;
foreach (var item in m)
{
Response.Write(item.ToString() + "
");
}
注意 orderby 是连在一起的,而不是 order by;还有等于判断是“==”,而不是“=”。您可能会说 descending 多难写啊,不如 SQL 的 desc,其实不必担心,Visual Web Developer 和 Visual Studio 都有智能提示的。
三:linq可应用在哪些场景?
Linq to Object、Linq to XML、Linq to DataSet、Linq to Entities、Parallel Linq(并行处理linq查询返回的数据)
linq的基本语法:var result = from item in container select item;
linq获取数据子集: var result = from item in container where booleanexpression select item;
linq to object 例子
static void QueryStrings()
{
string[] games = { "Morrowind", "Uncharted 2", "Fallout 3", "Daxter", "Shock2" };
//构建一个查询表达式(注意:ling表达式在迭代内容之前,他们不会真正的运行计算)//linq此时还没有运算
//linq查询的结果集,应该总是使用隐式类型,在绝大数情况下,真正的返回值实现了泛型 IEnumerable
var subset = from g in games where g.Contains(" ") orderby g select g;
//上面代码也可以写成 IEnumerable
//输出结果。在迭代的时候才运算(这叫:延迟执行)
foreach (string s in subset)
{
Console.WriteLine("含有空格的是:{0}",s);
}
}
linq在迭代外运算例子:
//在foreach逻辑外运算linq
static void QueryInt()
{
//如果希望在foreach逻辑外表运算Linq表达式,可以调用有Enumerable类型定义的扩展方法。如ToArray
int[] numbers = { 2, 10, 30, 15, 1, 22 };
//立即获取数据
int[] rst =( from i in numbers where i >10 orderby i select i).ToArray
}
linq查询中的常用函数
1.count
static void FunLinq()
{
int[] numbers = { 2, 10, 30, 15, 1, 22 };
//输出大于10的总数
int count = (from i in numbers where i > 10 orderby i select i).Count
Console.WriteLine(count);//输出:3
}
2.Reverse
var newnumbers = from i in numbers select i;
foreach (var p in numbers.Reverse())
{
Console.WriteLine(p);//输出22 1 15 30 10 2
}
3.orderby 对linq进行排序,默认是正序
//排序(正序)
string[] games = { "Morrowind", "Uncharted 2", "Fallout 3", "Daxter", "Shock2" };
var newn = from i in games orderby i ascending select i;
foreach (var p in games)
{
Console.Write(p+",");//
}
4.Distinct()移除数据中的重复项目 //排序(正序)
string[] games = { "Morrowind", "Uncharted 2", "Fallout 3", "Daxter", "Shock2", "Shock2"};
var newn = from i in games orderby i ascending select i;
foreach (var p in games.Disinct())
{
Console.Write(p+",");//
}
5.聚合操作
//聚合操作
//最大值
var maxi =( from i in games orderby i ascending select i).Max();
//最小值
var mini = (from i in games orderby i ascending select i).Min();
//平均值
var avar = (from i in numbers orderby i ascending select i).Average();
//总和
var sum = (from i in numbers orderby i ascending select i).Sum();