2014-07-08 33 views
0

AnonymousType#1的正確返回數據類型是什麼?AnonymousType#1的返回數據類型

此代碼正在工作。

var c = p.IQueryableGetAll() 
     .Where(r => r.Gender == "M") 
     .Select(r => new { r.FirstName, r.LastName }) 
     .ToList(); 

但是,當我把它放在一個函數中,會發生錯誤。

public List<object> GetFirstNameAndLastNameOfMales() 
{ 
    var p = new Program(); 
    return p.IQueryableGetAll() 
      .Where(r => r.Gender == "M") 
      .Select(r => new { r.FirstName, r.LastName }) 
      .ToList(); 
} 

這裏的錯誤

無法隱式轉換類型 System.Collections.Generic.List<AnonymousType#1>System.Collections.Generic.List<object>

它是如何正確地完成?謝謝。

+0

http://stackoverflow.com/questions/10073319/returning-anonymous-type-in​​-c-sharp – Jonny

+4

爲什麼你想*返回一個匿名類型?如果您需要使用匿名類型的內容長於單個方法的範圍,則只需創建一個命名類來保存數據。 –

+0

我只想要一個 – Ryan

回答

2

您在這兩種情況下查詢都是正確的。但是,導致第二種情況下的問題是您的方法的返回類型。

你可以試試這個:

return p.IQueryableGetAll() 
     .Where(r => r.Gender == "M") 
     .Select(r => new { r.FirstName, r.LastName }).ToList<Object>(); 

爲什麼您收到此錯誤的原因是因爲

Select(r => new { r.FirstName, r.LastName })

選擇一個匿名類型爲具有Gender==M序列中的每個元素。查詢結尾處的.ToList()將創建一個List對象,這些對象的這種匿名類型具有這兩個屬性。

一個更好的選擇是創建一個類,將持有這兩個屬性,我們稱之爲Customer然後執行以下操作:

public List<Customer> GetFirstNameAndLastNameOfMales() 
{ 
    var p = new Program(); 
    return p.IQueryableGetAll() 
      .Where(r => r.Gender == "M") 
      .Select(r => new Customer { 
        FirstName = r.FirstName, 
        LastName = r.LastName 
      }).ToList(); 
} 
+2

作品,當然可以指出,應該重新考慮兩次將返回的匿名類型轉換爲「object」。 –

+0

爲什麼?這是一個不好的做法? – Ryan

+0

@KonradKokosa感謝您的評論!這就是爲什麼我說過,更好的選擇是創建一個可以取代匿名類型的類。 – Christos

0

它不起作用,因爲List<T>是不是協變的 - 這是一個特定類型的列表,所以你不能添加任何對象。您可以:

  1. 創建一個具體類型,並用它
  2. 投下你的結果提出異議:

    .Select(r => (object)(new { r.FirstName, r.LastName })) 
    
  3. 變化返回類型IEnumerable<object>協變(因爲你可以't add to it)

選項1是cl eanest,但需要額外的代碼 - 選項2和3在查詢端很容易,但在客戶端需要反射或dynamic(以及運行時間漏洞,缺乏編譯時安全性等)。

+0

@D斯坦利我會很感激你,如果你能看看我的帖子,並告訴我我的錯在哪裏,因爲我得到了一個低估,沒有評論指出我錯在哪裏。非常感謝您提前! – Christos

相關問題