其實不光在select操作中有匿名類,其他操作中也有。讓我們一起來理解下匿名類。上面的語句與
var q = db.Customers.Select(c=>new {c,ContactName,c.Phone});是等價的。匿名類是c# 3.0中新出現的特性。其實質是編譯器根據用戶定義,自動產生一個匿名的類,幫用戶實現臨時變量的儲存。注意,是臨時變量。大量使用匿名類會使程序可讀性降低。匿名類還依賴於另外一個特性,就是在c# 3.0可以支持根據property來創建對象。比如,有類
public class Person
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
}
以前,我們只可以用構造函數來創建其對象,現在在3.0中支持用property來創建,即,可以用
var d = new Person { Name = "s" }; 來創建對象。在這裡,你可能還對var類型產生疑問。你可能以為c#3.0和Javascript一樣是弱類型的。其實var並不是c#3.0的類型,它是編譯器的關鍵字,編譯器根據實際變量的返回類型,自動推斷類型。那麼var c = null; 是無法編譯通過,因為編譯不知道null代表那個類型。所以,c#3.0還是強類型的。
現在3.0可以支持用property來創建對象了,那麼就有了匿名類的出現。比如,var d = new { Name = "s" };編譯器自動產生一個有property叫做Name的匿名類,然後按這個類型分配內存,並初始化對象。在這個地方,還有個問題,比如,var d = new { "s" };是編譯不通過的。因為,編譯器不知道匿名類中的property的名字。但是,如果,string c = "d"; var d = new { c}; 則是可以通過編譯的。編譯器會創建一個叫做匿名類帶有叫c的property。
在dlinq中,比如new {c,ContactName,c.Phone});這裡出現ContactName和Phone都是我們在影射文件中定義的和表中字段相對應的property。編譯器在取會數據並創建對象時,會創建一個匿名類,這個類有兩個屬性,為ContactName和Phone,然後根據數據初始化對象。匿名類還有另外一種形式。
var q =
from e in db.Employees
select new {Name = e.FirstName + " " + e.LastName, Phone = e.HomePhone};
這種形式和第一種不同的是,編譯器會重命名property的名字。當然也可以把兩種形式組合起來。
var q =
from p in db.Products
select new {p.ProductID, HalfPrice = p.UnitPrice / 2};
第一個屬性的名字不會變,第二個會被重新命名。
好,就先講這幾個,下節我會介紹幾個更復雜的用法。