Linq(03)基础之Orderby & group-by
说明:本内容来自微软的MSDN,好记性不如烂笔头,加深印象。
我的心得:@开头
Let子句
1) 在查询表达式中,存储子表达式的结果有时很有用,这样可以在随后的子句中使用。
2) 该关键字可以创建一个新的范围变量,并且用您提供的表达式的结果初始化该变量。
3) 一旦用值初始化了该范围变量,它就不能用于存储其他值。
@相当于SQL的子查询
@计算一次,提高性能。
public class let子句 { // 找出含m的英文名字 public static void TestLet() { string[] strings = { "A penny saved is a penny earned.", "The early bird catches the worm.", "The pen is mightier than the sword." };
var earlyBirdQuery = from sentence in strings let words = sentence.Split(' ') from word in words let w = word.ToLower() where w[0] == 'a' || w[0] == 'e' select word;
foreach (var item in earlyBirdQuery) { Console.WriteLine("\"{0}\" starts with a vowel", item); } } }
|
where 子句
1) 它将一个布尔条件(“谓词”)应用于每个源元素(由范围变量引用),并返回满足指定条件的元素。
2) 一个查询表达式可以包含多个 where 子句,一个子句可以包含多个谓词子表达式。
3) 运算符:> < 等于(==) 或(||) 且(&&)
4) where 子句是一种筛选机制
5) 不能放在第一个或最后一个子句,它几乎可以放在查询表达式中的任何位置。
@与SQL的where用途相同,算术运算符和逻辑运算符使用.NET中的。
orderby 子句
1) orderby 子句可使返回的序列或子序列(组)按升序或降序排序。
2) 可以指定多个键,以便执行一个或多个次要排序操作。
3) 默认排序顺序为升序(ascending)。
4) 可以指定自定义比较器。但是,只能通过基于方法的语法使用它。
5) 编译时,orderby 子句被转换为对 OrderBy 方法的调用。orderby 子句中的多个键转换为 ThenBy 方法调用。
@与SQL的order by用途相同,也有升序和降序。
group 子句
1) group 子句返回一个 IGrouping<(Of <(TKey, TElement>)>) 对象序列,这些对象包含零个或更多个与该组的键值匹配的项。
2) 对每个组执行附加查询操作,则可以使用 into 上下文关键字指定一个临时标识符。
3) 使用 into 时,必须继续编写该查询,并最终用一个 select 语句或另一个 group 子句结束该查询。通常和group by 结合使用。
// Group students by the first letter of their last name // Query variable is an IEnumerable<IGrouping<char, Student>> var studentQuery2 = from student in students group student by student.Last[0] into g orderby g.Key select g;
|
4) 组键可以是任何类型,如字符串、内置数值类型、用户定义的命名类型或匿名类型。
5) 布尔值作为键将结果划分成两个组。请注意,该值是由 group 子句中的子表达式产生的。
按字符串进行分组
char。可以很容易地改为指定字符串键
按布尔进行分组
使用布尔值作为键将结果划分成两个组。请注意,该值是由 group 子句中的子表达式产生的。
按数值范围进行分组
按复合键进行分组
当您想要按照多个键对元素进行分组时,可使用复合键。通过使用匿名类型或命名类型来存储键元素,可以创建复合键。当您想要按照多个键对元素进行分组时,可使用复合键。通过使用匿名类型或命名类型来存储键元素,可以创建复合键。
public static void TestGroupby() { IEnumerable<IGrouping<string,Student>> g = Student.students .GroupBy(x => x.Last);
foreach (IGrouping<string,Student> item in g) { Console.WriteLine(string.Format("group key {0}",item.Key));
foreach (Student item2 in item) { Console.WriteLine(string.Format("name {0}", item2.First)); } } } |
join 子句
1) 使用 join 子句可以将来自不同源序列并且在对象模型中没有直接关系的元素相关联。
唯一的要求是每个源中的元素需要共享某个可以进行比较以判断是否相等的值。