2017-03-13 57 views
-1

長時間讀者和第一次問題提問者。沒有進一步的道歉我的困境如下:LINQ從孩子的孩子得到平均值

我試圖顯示使用viewmodel在視圖中存儲在數據庫中的一些平均值。一切都很順利,直到我試圖檢索一個值在孩子的子表中(我確信有關於這個關係的更好的詞,而不是那個)。

這個模型看起來是這樣的:Library model

據我瞭解,有一個簡單的數據庫,這樣有問題的平均分數可以很容易地存儲在「尚書」表,但是我只是一個簡單的複製問題測試環境。

視圖模型很簡單:

public string Firstname { get; set; } 
    public int NumberOfBooks { get; set; } 
    public double AvgScore { get; set; } 

    public double BookPeopleAvg { get; set; } 
    public double AvidReadersAvg { get; set; } 
    public double LibraryinternalAvg { get; set; } 

這裏是控制器動作:

public async Task<ActionResult> Index() 
    { 
     var authors = db.Authors    
      .Include(g => g.Books) 
      .Include(g => g.Books.Select(c => c.Reviews)) 
      .Select(g => new AuthorViewModel 
     { 
      Firstname = g.Firstname,    
      NumberOfBooks = g.Books.Count(), 
      AvgScore = g.Books.Average(c => (double?)c.Score) ?? 0, 
      BookPeopleAvg = g.Books.Select(c => c.Reviews.Average(x => (double?)x.BookPeople) ?? 0) 
     }); 
     return View(await authors.ToListAsync()); 
    } 

我能夠很好地得到AvgScore,但得到的BookPeopleAvg平均(和其他兩個)對我來說很困難。我使用GroupBy發現了一些答案,但我一直無法將它們編織到我的查詢中。

我得到BookPeopleAvg編譯器錯誤是:

CS0029無法隱式轉換類型「System.Collections.Generic.IEnumerable」到

我已經嘗試了一些不同的類型轉換,雖然我不「雙」不認爲問題在於轉換,儘管錯誤信息暗示如此。

最後,這是在MVC 5中完成的,如果這是相關的。

我希望有人能以任何方式幫助我,在此先感謝!

+1

孩子的孩子通常被稱爲一個「孫子」或一個「後裔」 – Jamiec

+0

@Jamiec孫子將是正確的名詞,後代不定義水平,儘管後代包括孫子。 – Andrew

+0

@Andrew我認爲這是我的觀點。具體的術語是孫子,這是一般術語的後裔。我可能有點不清楚。 – Jamiec

回答

0

改變這種

BookPeopleAvg = g.Books.Select(c => c.Reviews.Average(x => (double?)x.BookPeople) ?? 0) 

這個

BookPeopleAvg = g.Books.SelectMany(c => c.Reviews).Average(x => (double?)x.BookPeople) ?? 0) 

你做它實際上選擇的是雙打的IEnumerable(您的平均值)的方式

+0

這很奇妙,謝謝你Liviu。我不得不刪除最後一個關閉的括號,否則我得到了令人難以置信的編譯器錯誤。 – Wubbler