LINQ 的查询语法和 SQL 非常相似,只不过为了智能提示和类型推断将 select 子句放在最后。
var q = from n in nums select n;
"from n in nums" 中的两个变量用法类似 "foreach (var n in nums)","select n" 用于返回当前变量。
1. Filtering
所谓 Filtering,就是 where 子句,用于进行条件过滤。
Query Syntax
var q = from n in nums where n % 2 == 0 select n;
foreach (var v in q)
Console.WriteLine(v);
Method Syntax
输出:
2
4
2. Ordering
使用 "orderby ... ascending" 或 "orderby ... descending" 子句可以实现对结果的排序操作。
Query Syntax
var q = from n in nums orderby n descending select n;
foreach (var v in q)
Console.WriteLine(v);
Method Syntax
输出:
4
3
2
1
3. Joining
下面这个例子稍微有点复杂,我们的意图是将 User.Sex 从整数转换成对应的性别字符。 "join...in..." 的作用是将额外的数据源合并进来,而 "on...equals..." 则用于说明合并的条件,最后我们使用匿名类型来创建所需的新数据容器。
Query Syntax
new { Id = 0, Name = "女"},
new { Id = 1, Name = "男"}
};
var users = new[] {
new { Name = "User1", Sex = 1 },
new { Name = "User2", Sex = 0 },
new { Name = "User3", Sex = 1 },
new { Name = "User4", Sex = 0 },
new { Name = "User5", Sex = 1 },
new { Name = "User6", Sex = 0 },
new { Name = "User7", Sex = 1 },
new { Name = "User8", Sex = 0 },
new { Name = "User9", Sex = 1 }
};
var q = from u in users
join s in sex
on u.Sex equals s.Id
select new { Name = u.Name, Sex = s.Name };
foreach (var u in q)
Console.WriteLine("Name:{0} Sex:{1}", u.Name, u.Sex);
Method Syntax
输出:
Name:User1 Sex:男
Name:User2 Sex:女
Name:User3 Sex:男
Name:User4 Sex:女
Name:User5 Sex:男
Name:User6 Sex:女
Name:User7 Sex:男
Name:User8 Sex:女
Name:User9 Sex:男
4. Grouping
使用 "group...by..." 可以按照一定的条件进行分组返回,该语句可以省略 select 子句。
Query Syntax
new { Name = "User1", Sex = 1 },
new { Name = "User2", Sex = 0 },
new { Name = "User3", Sex = 1 },
new { Name = "User4", Sex = 0 },
new { Name = "User5", Sex = 1 },
new { Name = "User6", Sex = 0 },
new { Name = "User7", Sex = 1 },
new { Name = "User8", Sex = 0 },
new { Name = "User9", Sex = 1 }
};
var q = from u in users group u by u.Sex;
foreach (var group in q)
{
Console.WriteLine("---------------");
foreach (var u in group)
Console.WriteLine(u.Name);
}
Method Syntax
输出:
---------------
User1
User3
User5
User7
User9
---------------
User2
User4
User6
User8