我有一个List,其中包含IQueryAble作为属性。我将List传递给MVC项目中的View。我使用foreach迭代List。在foreach内:
列表类型的相册
<% foreach(var x in Albums){%>
<h1><%= x.Title %></h1>
<p><%= x.Photos.Count() %> </p>
<%}%>
显示标题不是问题,但是一旦它到达Count()就会抛出错误:“对于具体化的查询结果,不支持此方法。”
这是什么意思?我不能在集合中收集?只要我遍历集合,该类中的其他集合就不再可用了。感谢
答案 0 :(得分:3)
我自己就是这个问题,谷歌搜索并没有帮助。我想出了修复代码的最简单方法。只需在.Count()之前添加一个.ToList(),它就能正常工作。
<% foreach(var x in Albums){%>
<h1><%= x.Title %></h1>
<p><%= x.Photos.ToList().Count() %> </p>
<%}%>
集合中的集合尚未评估,因此您无法计算它。我猜它正试图节省执行时间,以防你不使用内部集合。
示例:
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尚未评估,因为它上面没有.toList()。如果你试图添加它,它将抛出异常。
result.nodes [0] .Count()将抛出错误。
result.nodes [0] .ToList()。Count()将成功。
答案 1 :(得分: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()
)不同,您不再需要从数据库加载所有Photo记录以获取计数。如果需要,可以加载该信息,但仅在您需要时才会加载。
答案 2 :(得分:0)
我认为您必须在相册查询中包含照片。像。的东西。
var Albums = from a in context.Ablums.Include("Photos") select a;