具体化查询结果的问题 - LINQ

时间:2010-02-10 04:41:08

标签: linq entity-framework

我有一个List,其中包含IQueryAble作为属性。我将List传递给MVC项目中的View。我使用foreach迭代List。在foreach内:

列表类型的相册

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

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

<%}%>

显示标题不是问题,但是一旦它到达Count()就会抛出错误:“对于具体化的查询结果,不支持此方法。”

这是什么意思?我不能在集合中收集?只要我遍历集合,该类中的其他集合就不再可用了。

感谢

3 个答案:

答案 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;