DataLoadOptions未加载链接表

时间:2013-04-29 13:30:35

标签: c# linq asp.net-mvc-4

我试图将主表(用户)和链接表(帖子)中的数据传递到视图中,但是,当我在视图中无法访问任何链表信息。我正在使用使用linq 2 sql创建的模型,并且我使用LoadWith方法来包含相关表中的数据。

以下是ActionResult中的代码:

BlogModelDataContext context = new BlogModelDataContext();

DataLoadOptions dlo = new DataLoadOptions();
dlo.LoadWith<UserModel>(c => c.PostModels);
context.LoadOptions = dlo;

var users = from u in context.UserModels
                         where u.UserId == WebSecurity.CurrentUserId
                         select u;

return View(users);

以下是ActionResults视图中的代码:

@model IEnumerable<MvcBlog.Models.UserModel>

@{
    ViewBag.Title = "NewProfile";
 }

 <h2>NewProfile</h2>

 @foreach (var item in Model)
 {
     @item.JoinDate
     @item.Username

     @foreach (var post in item.PostModels)
     {
         @post.
     }
 }

但是,当我尝试访问post表的字段时,没有显示任何内容,我收到以下警告:

  

错误2 foreach语句不能对类型为
的变量进行操作   &#39; System.Data.Linq.EntitySet&#39;因为   &#39; System.Data.Linq.EntitySet&#39;才不是   包含&#39; GetEnumerator&#39;

的公开定义

我想过,一旦我使用LoadWith,我应该能够访问Post表的属性。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

使用Linq尤其是IEnumerable时要小心。您当前的select语句返回一个IEnumerable对象。这意味着在您开始迭代IEnumerable对象(即在View中)之前,linq语句实际上并未执行。通过添加.ToList()实际上会强制在该点评估枚举。

然后,您将使用PostModel将UserModel列表传递给您的视图。

总之,将.ToList()添加到linq语句中。

var users = (from u in context.UserModels
             where u.UserId == WebSecurity.CurrentUserId
             select u).ToList();