2012-05-23 70 views
0

我試圖從LINQ檢索的dynamic對象列表中包裝一個名爲QueryResultViewModel的類的查詢結果。這些包含一個稱爲Worked的整數字段。我不應該使用非動態類型,因爲根據查詢它有其他字段。我試過:如何訪問動態類型的字段?

var query = new HoursQuery(.. parameters ..); 
    this.Result = new ObservableCollection<QueryResultViewModel>(
     query.Execute().Select(x => new QueryResultViewModel(x.Worked))); 

但我得到「‘對象’不包含‘任職’的定義」,我不知道這是否可以固定在不改變查詢的返回類型。

的執行代碼,可能是太有用:

var res = some_list.GroupBy(a => new { a.Employee, a.RelatedTask, a.Start.Month }) 
     .Select(g => new { K = g.Key, Worked = g.Sum(s => s.Duration.TotalHours) }); 

編輯:這個工作很好,但也許這是不是很優雅。

public class HQueryDTO 
    { 
     public double Worked; 
     public object K; 
    } 

    public IEnumerable<dynamic> Execute() 
    { 
     var list = base.Execute(); 
     return res = list.GroupBy(a => new { a.Employee, a.RelatedTask }) 
      .Select(g => new HQueryDTO { K = g.Key, Worked = g.Sum(s => s.Duration.TotalHours) }); 
    } 

既然結果有一個類型,它可以返回動態。

回答

1

假設你得到這個錯誤在編譯時,在這種情況下,簡單地通過鑄造介紹dynamic

.Select(x => new QueryResultViewModel(((dynamic)x).Worked)) 
+0

沒有。錯誤是運行時試圖訪問工作。我還不能回答我自己的問題,但我用新的信息編輯它。 –

0

我假設的Execute簽名是一樣的東西object Execute()。如果你退回dynamic,它應該工作。

+0

簽名是IEnumerable 所以它應該工作 –