2011-05-24 104 views
1

我試圖弄清楚從我的Web服務獲取數據的乾淨方式,即鍵/值對。如何將匿名類型轉換爲鍵值對對象

有沒有辦法採取這樣的查詢:

  var q = db.Ratings.Select(x => new 
            { 
             x.pro, 
             x.con, 
             x.otherThoughts, 
             x.Item.title, 
             x.score, 
             x.subject 
            }); 

就會返回一個鍵值對,其中鍵將以上列出的列,與其對應的價值?

而不是創建一個單獨的類?

myDict.Add("pro", q.pro); 
myDict.Add("con", q.con); 

這是效率不高,創造這樣一個類不是非此即彼,尤其是如果我有許多方法:

public class Rating 
{ 
    public string pro { get; set; } 
    public string con { get; set; } 
} 

我搜索所有打開了包含前兩個代碼示例樣本。

+0

應該很容易編寫一個反映一個對象並返回正確的'Dictionary '的方法。 另外,你可以看看使用'動態'。但是,這種方法在中等信任環境中並不是那麼脆弱,因此如果您要部署到共享託管的網站,請小心。 – marcind 2011-05-24 02:38:09

+0

你爲什麼認爲選擇非描述性字典比返回一個類更清潔* *方法? – 2011-05-24 02:42:30

+1

如果我在一個名爲Ajax的Web服務中有30個方法,現在我有30個方法和30個類,愚蠢。 – 2011-05-24 02:44:49

回答

1

我不建議使用您正在查看的'無類型'方法。
我會使用類型化對象,而不是你想創建的。

但是,這裏是你的問題的答案。您可以根據需要使用DataTable對象。像這樣:

var items = new[] 
{ 
    new Item { Id = 1, Name = "test1" }, 
    new Item { Id = 2, Name = "test2" } 
}; 

var dataTable = new DataTable(); 
var propeties = typeof(Item).GetProperties(); 
Array.ForEach(propeties, arg => dataTable.Columns.Add(arg.Name, arg.PropertyType)); 
Array.ForEach(items, item => dataTable.Rows.Add(propeties.Select(arg => arg.GetValue(item, null)).ToArray())); 
return dataTable;