2010-02-10 82 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()将成功。