2012-07-09 83 views
1

從書「基本LINQ」請檢查下列程序:LINQ C#查詢的邏輯是什麼?

class Customer 
    { 
    public string CustomerID {get;set;} 
    public string ContactName {get;set;} 
    public string City {get;set;} 
    public static List<Customer> GetCustomers() 
    { 
     return new List<Customer> 
     { 
      new Customer {CustomerID = "ALFKI", ContactName = "Maria Anders", City = "Berlin"}, 
      new Customer {CustomerID = "ANATR", ContactName = "Sns Trujillo", City = "Mexico D.F."}, 
      new Customer {CustomerID = "ANTON", ContactName = "Antonio Moreno", City = "Mexico D.F."} 
     }; 
    } 
    } 
void Main() 
{ 
    var query = from c in Customer.GetCustomers() 
       where c.City == "Mexico D.F." 
       select new { c.City, c.ContactName}; 
    foreach (var cityandcontact in query) 
    { 
     Console.WriteLine(cityandcontact); 
    } 
} 

在LINQ查詢,爲什麼它給了我的錯誤,如果我從行刪除「新」:
select new {c.City, c.ContactName};

爲什麼我們不能只是這樣寫

select c.City, c.ContactName; 

這裏的邏輯是什麼?

回答

4

查詢返回同一類的對象的枚舉。它可以是任何類,但對於所有行,它只需要一個類。您不能將對象(城市和聯繫人姓名)組合成單個對象。在這種情況下,您將它們組合爲匿名類型的對象,並具有兩個屬性。

在附註中,完全沒有使用Select方法的優點,因爲兩個屬性都來自相同的Customer類。其實,還有比舊客戶對象保持不變,這樣的效率較低:

var query = from c in Customer.GetCustomers() 
      where c.City == "Mexico D.F."; 
foreach (var c in query) 
{ 
    Console.WriteLine("{0} {1}", c.City, c.ContactName); 
} 
+0

前兩行清楚我爲什麼我們需要使用匿名類型。因爲你正在使用的查詢語法 – Mitul 2012-07-09 02:54:47

+1

你仍然需要選擇,你只是不需要一個匿名對象來保存值。 – 2012-07-09 02:55:26

+0

+1指出原始對象都可以使用。 – 2012-07-09 03:08:23

1

LINQ方法,像其他的C#方法,只能返回一個值/對象。 (有附加的沒有語法的支持表示假設構建奇蹟般地做new { .. }東西做什麼。)

這就是爲什麼不同的領域都在一個新的對象「包裝」:它是那麼值/對象與成員代表所有選定的字段。

(同樣地,最終的結果,一個IEnumerable<..>,也只是一個值/與序列中0或以上的元素對象:在這種情況下,每個元件是與上述new { .. }創建新的對象。)

0

new { c.City, c.ContactName};是匿名類型的C#語法。

0

'select'選擇一個Customer類,它包含一個City變量和一個ContactNamr變量。所以,你必須提供選擇與這些變量的新類

0

這不是SQL這是linq,和語法基本上你看到的。

select new { c.City, c.ContactName}; 

將查詢的輸出限制爲僅包含City和ContactName的類型。

你可能會問這是什麼類型?那麼這是編譯器爲您創建的anonymous type

然後代碼遍歷查詢結果(IEnumerable<this_new_type>)並寫入此新類型的ToString()。

0

select new正在創建一個新的anonymous object

「匿名類型提供了一種方便的方式來封裝一組只讀屬性到一個單一的對象,而無需顯式定義類型第一」

select new {c.City, c.ContactName}; 

您還可以創建一個具體的類,伸入。

即一個名爲布拉赫類:

class Blah 
{ 
    public string City {get;set;} 
    public string ContactName {get;set;} 
} 

... [rest of query] 
select new Blah {c.City, c.ContactName}; 

你不能去原因 「選擇c.City,c.ContactName;」,是因爲語言的語法是不是設計來處理它。