linq對數據的查詢方式的表達形式主要有兩種:
var demo =from p in pList
where p.id=***
select p;
var demo =pList.where(p=>p.id=***) select p;
以上是linq最近常見的兩種表達形式。linq支持多種操作符的操作,下面對主要的常操作符進行說明:
select 與selectmany
select操作符聲明:
public static IEnumerable<s> select<T,S>{
this IEnumerable<T> source,
Func<T,S> selector
}
select 操作符將根據selector函數對源序列中的每個元素進行求值運算並依次返回該值,構成返回值序列.
舉個簡單例子:
var book= books.Select(p=>p.Name);
以上的select子句就該一個book對象序列投影到了一個字符串的對象序列,當然可以有更復雜的應用如把序列投影到一個對象等,如以下代碼就是從book集合中找出publisher對象,就將序列投影到一個具體的對象上。
var publisher=from p in books
select p.publisher
在select 返回的結果集中,其中的對象即可以是原來的對象,也可以是包含若干字段的一個新對象。
如下例:
var Books=from book in sampleBookData.Books
select new{book.title,book.price,book.publisher.Name};
也可以寫成如下形式:
var Books=from book in sampleBookData.Books
select new{
Title=book.title,
Price=book.price,
publisherName=book.publisher.Name
};
此類操作創建出一個原數據的一個投影,也是將此類操作歸類為投影的一個重要的原因。
下面來看另一個投影操作:selectmany
操作符聲明:
public static IEnumerable<s> select<T,S>{
this IEnumerable<T> source,
Func<T,IEnumerable<s>> selector
}
與select 不同 的是selectmany返回的是一個序列.
selectmany與select 不同的是它會把返回序列集合中的各個元素連接起來形成一個新的序列
具體先來比較兩段代碼:
var tmp=sampleBook.select(p=>p.books.author);
foreach(var item in tmp)
{
foreach(var item1 in item.author)
{
console.writeline(item1.name);
}
}
以上代碼即我們要實現查詢所有圖書中的作者的信息,book對象的author屬性是由author對象來組成的,所以select的的操作返回了由這些對像數組組成的對像序列,即返回了book與author,book包含了author的對像序列
下面來看selectMany的代碼
var tmp=sampleBook.selectmany(p=>p.books.author);
foreach(var item in tmp)
{
console.writeline(item.Name);
}
可以明顯看出來,selectmany的代碼明顯簡潔了很多,我們需要的是作者的信息,並不需要返回全部的序列信息,而selectmany正好可以很聰明的做到將兩個序列分開後組成一個新的序列返回給我們,而這也正是我們需要的結果.