介绍C# 中 Linq 的应用。
- Introduction:
LINQ: .NET Language Integrated Query.
尝试一个问题:有两个数组
int[] a = new int[] { 1, 2, 5, 4, 1, 4, 7, 2, 9, 0 };
int [] b = new int [] { 2, 4, 7, 8 };
找他们相同的元素,List<int> c = new List<int>();
foreach(int a in A){ foreach(int b in b) { if (a==b) {
c.add(a);
} } }而Linq 的用法
IEnumerable<int> C = from x in a from y in b where x == y select x;
/Linq: 命名空间是System.Linq 核心对象 IEnumerable关键字:from : 指定数据源和范围变量(类似于迭代变量)。
where: 根据一个或多个由逻辑“与”和逻辑“或”运算符(&& 或 ||)分隔的布尔表达式筛选源元素。
select: 指定当执行查询时返回的序列中的元素将具有的类型和形式。
group: 按照指定的键值对查询结果进行分组。
into: 提供一个标识符,它可以充当对 join、group 或 select 子句的结果的引用。
orderby: 基于元素类型的默认比较器按升序或降序对查询结果进行排序。
join: 基于两个指定匹配条件之间的相等比较来联接两个数据源。
let: 引入一个用于存储查询表达式中的子表达式结果的范围变量。
in: join 子句中的上下文关键字。
on: join 子句中的上下文关键字。
equals: join 子句中的上下文关键字。
by: group 子句中的上下文关键字。
ascending:orderby 子句中的上下文关键字。
descending:orderby 子句中的上下文关键字。语法说明,每个LINQ语句都以 from作为开头,以 select作为结束,这点和T-SQL语法不通的切记先入为主的思考。其他关键字如 where则类似T-SQL作为筛选判断条件。例如:IEnumerable<T> nums = from n in nums where .... orderby ... select ....NET3.0 可以用var nums = from n in nums where .... orderby... select....
- 案例程序
普通查询
var query = from num in num select num.ProperyA
筛选查询
var query = from obj in objs where obj.ProperyA > Condition select obj
分组查询
var query = from obj in objs group obj by obj.PropertyA into g orderby g.Key select g;
内联查询
var query= from obj1 in objs1 join obj2 in objs2 on obj1.ID equals obj2.ID select new { A= obj1.Property, B = obj2.Property };
左外联查询
var query = from obj1 in objs1 join obj2 in objs2 on obj1.ID equals obj2.Obj1ID into g from subpet in g.DefaultIfEmpty() select new { P1 = obj1.P1, P2 = (subpet == null ? null : subpet.P2 ) };
MSDN的教程 http://msdn.microsoft.com/zh-cn/library/vstudio/bb397906.aspx
- 延迟加载 (delay loaded/Lazy loading): 语句延迟执行,直到真正需要执行语句的时候才去执行那条语句
延迟加载(Lazy loading)与直接加载(Eager loading)是一种设计模式,并不是Linq to Sql中独有的
延迟加载就是将对象的初始化延迟,在程序使用该对象时才去初始化,如果不使用则不会进行初始化。使用延迟加载主要是为了提高程序的执行效率。-- from 百度百科
public static class LocalExtensions{public static IEnumerable< string > ConvertCollectionToUpperCase( this IEnumerable <string > source){foreach (string str in source){Console .WriteLine("ToUpper: source {0}" , str);yield return str.ToUpper();}}}
{string [] stringArray = { "abc" , "def", "ghi" };
var q = from str in stringArray.ConvertCollectionToUpperCase()
select str;
foreach (string str in q)
Console .WriteLine("Main: str {0}" , str);
}
输出ToUpper: source abc // 处理一条
Main: str ABC // 返回一条
ToUpper: source def // 处理一条
Main: str DEF // 返回一条
ToUpper: source ghi
Main: str GHI
- Lambda 表达式 格式
(parameters) => {expression}
delegateintdel(inti);publicvoidExample6(){del myDelegate = x => x * x;
intj = myDelegate(5); //j = 25
Console.writeLine(j);
}int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; int oddNumbers = numbers.Count(n => n % 2 == 1);
//
var array = new int[]{1,2,3,4,5}; var query1 = from arr in array select arr; var query2 = array.Select(e => e);
查找
var array = new int[]{1,2,3,4,5}; var query1 = from arr in array where arr > 2 select arr; var query2 = array.Where(e => e > 2);
最大
var array = new int[]{1,2,3,4,5}; var max = (from arr in array.Where(e => e > 2) select arr).Max();
- Linq 对Dataset的操作