這裡簡單介紹Linq的投影、篩選和排序子句。
Select
select 在一個集合序列按給定的條件進行投影,select 可以返回組合的篩選結果,返回匿名類型,對返回結果進行操作,返回組合的子查詢結果等等。
select 的方法定義原形為:
public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
該擴展方法是在Enumerable類型中定義的。
// 數據源的類型的屬性
var result = from student in DataSource.Students
where student.Name.Length > 3
select student.Name;
// 數據源類型篩選後的結果
var result = from student in DataSource.Students
where student.Name.Length > 3
select student;
// 新類型
var result = from student in DataSource.Students
where student.Name.Length > 3
select new Student { Name = student.Name, StudentID = student.StudentID };
// 匿名類型
var result = from student in DataSource.Students
where student.Name.Length > 3
select new { Name = student.Name, StudentID = student.StudentID };
// 對返回結果進行操作
var result = from student in DataSource.Students
where student.Name.Length > 3
select student.ToString();
由Select方法原型可看出,返回結果為:IEnumerable<T>類型。
SelectMany
SelectMany定義原型為:
public static IEnumerable<TResult> SelectMany<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, IEnumerable<TResult>> selector)
通過原型可以看出,篩選結果的每一個元素類型都應該實現IEnumerable<T>接口。
string實現了IEnumerable<T>接口,可以構造這樣的場景:查詢組成學生姓名的所有字符序列。
var result = DataSource.Students.SelectMany(str => str.Name);
等價的Select 子句為:
var result = from student in DataSource.Students
from ch in student.Name
select ch;
可以認為SelectMany是將序列的每個元素投影到 IEnumerable<(Of <(T>)>) 並將結果序列合並為一個序列。