【问题标题】:Issue with materialized query result - LINQ具体化查询结果的问题 - LINQ
【发布时间】:2010-02-10 04:41:07
【问题描述】:

我有一个包含 IQueryAble 作为属性的列表。我将 List 传递给我在 MVC 项目中的视图。我使用 foreach 遍历列表。在 foreach 内部:

List 类型的专辑

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

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

<%}%>

显示标题不是问题,但它会在碰到 Count() 时立即引发错误:“此方法不支持具体化查询结果。”

这是什么意思?我不能在收藏中收藏?一旦我遍历该集合,该类中的另一个集合就不再可用了。

谢谢

【问题讨论】:

    标签: linq entity-framework


    【解决方案1】:

    我自己也遇到了这个问题,谷歌搜索没有帮助。我想出了修复代码的最简单方法。只需在 .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() 会成功。

    【讨论】:

      【解决方案2】:

      使用演示模型:

      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&lt;IEnumerable&lt;AlbumPresentation&gt;&gt;

      请注意,与使用预先加载 (Include()) 不同,您不再需要从数据库中加载所有照片记录来获取计数。您可以在需要时加载该信息,但前提是您需要它。

      【讨论】:

      • 我认为这可行,但我需要更改底层模型。我使用演示模型。在我的演示模型中,我有这个公共类 AlbumViewModel{ public List MyAlbums {get;set:} } 每个相册里面都有照片。看起来我无法从我正在迭代的集合中执行任何 Linq 扩展操作。只是看不到原因。
      • 您只需要更改您的模型即可为其添加一个int 属性(用于计数)。至于为什么,我认为您没有在这里向我们展示更多代码。 “物化查询结果?”你的标签说 EF,但对我来说这听起来像是 L2S。
      【解决方案3】:

      我认为您必须在相册查询中包含照片。类似的东西。

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

      【讨论】:

      • 照片的集合已经包含在内,如果我调试它,我可以在我的控制器中看到它,但是一旦我遍历相册并尝试计算相册内的照片(在迭代内),它抛出了那个错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 2013-12-10
      • 1970-01-01
      • 2011-08-21
      相关资源
      最近更新 更多