2010-02-10 55 views
1

我有一個列表,其中包含IQueryAble作爲屬性。我將List傳遞給MVC項目中的View。我使用foreach遍歷List。在foreach內部:物化查詢結果問題 - LINQ

專輯類型列表中

<% foreach(var x in Albums){%> 

<h1><%= x.Title %></h1> 
<p><%= x.Photos.Count() %> </p> 

<%}%> 

顯示標題是不是一個問題,但它很快就拋出一個錯誤它擊中計數():「不反對支持此方法物化查詢結果「。

這是什麼意思?我不能在集合中收藏?只要我遍歷集合,該類中的其他集合不再可用。

感謝

回答

1

使用演示模式:

public class AlbumPresentation 
{ 
    public string Title { get; set; } 
    public int PhotoCount { get; set; } 
} 

然後project onto the model在你的控制器:

var model = (from a in Context.Albums // or, more likely, via a repository 
      select new AlbumPresentation 
      { 
       Title = a.Title, 
       PhotoCount = a.Photos.Count() 
      }).ToList(); 
return View(model); 

類型您查看的是現在ViewPage<IEnumerable<AlbumPresentation>>

請注意,與使用熱切加載(Include())不同,您不再需要從數據庫加載所有照片記錄來獲取計數。如果您需要,您可以加載該信息,但只有在您需要時才能加載該信息。可以加載該信息。

+0

,我認爲這會工作,但我需要改變墊層模型。我使用演示模型。在我的演講模式,我有這個 公共類AlbumViewModel { 公開名單 MyAlbums {獲取;集:}} 內每張專輯有照片。看起來我不能從我正在迭代的集合中進行任何Linq擴展操作。只是沒有看到原因。 – dritterweg 2010-02-10 18:10:14

+0

你只需要改變你的模型就可以添加一個'int'屬性(對於count)。至於爲什麼,我認爲還有更多的代碼沒有在這裏展示給我們。 「物化查詢結果?」你的標籤說EF,但這聽起來像L2S給我。 – 2010-02-10 18:14:24

0

我想你將不得不在您的相冊照片的查詢。就像是。

var Albums = from a in context.Ablums.Include("Photos") select a; 
+0

照片的收集已經包含,如果我調試它,我可以看到它在我的控制,但一旦我遍歷專輯,並嘗試計數專輯(迭代內)內的照片,它拋出一個錯誤。 – dritterweg 2010-02-10 05:33:57

3

我剛剛有這個問題,我自己和谷歌搜索沒有幫助。我想出了修復代碼的最簡單方法。只需在.Count()之前添加一個.ToList(),它就可以正常工作。

<% foreach(var x in Albums){%> 

<h1><%= x.Title %></h1> 
<p><%= x.Photos.ToList().Count() %> </p> 

<%}%> 

集合中的集合尚未評估,所以你不能得到它的計數。我猜這是爲了節省執行時間,以防你不使用內部集合。

例如:因爲沒有在其上的.toList()

var result = (from tsk in db.Tasks 
       where tsk.result == "Success" 
       orderby tsk.data_end descending 
       select new 
       { 
        tsk.data_end, 
       //here's an inner collection 
        nodes = (from err in db.Errors 
           where err.QueryEnd == tsk.data_end 
           select err.NodeName).Distinct() 
       }).ToList(); 

result.nodes尚未進行評估。如果你嘗試添加這個,它會拋出一個異常。

result.nodes [0] .Count()會引發錯誤。

result.nodes [0] .ToList()。COUNT()將成功。