2011-12-08 92 views
0

即时通讯工作与一个新的ASP.NET MVC3项目,它似乎像我缺少我的LINQ技能的东西。访问包含的对象

Im为json“call”格式化数据以用于我的jqGrid。

它工作正常,但现在我想通过Linq .Include()表达式添加相关对象。 想我最好用代码展示。

var query = db.Products.Include("Category"); 

var jsonData = new 
{ 
    total = 1, // calc 
    page = page, 
    records = db.Products.Count(), 
    rows = query.Select(x => new { x.Id, x.Name, x.PartNr }) 
     .ToList() 
     .Select(x => new { 
      id = x.Id, 
      cell = new string[] { 
       x.Id.ToString(), 
       x.Name.ToString(), 
       x.PartNr.ToString(), 
       //x.Category.Name.ToString() 
       //This does not work but object is there. 
     }}).ToArray(), 
    }; 

    return Json(jsonData, JsonRequestBehavior.AllowGet); 

问题区=>//x.Category.Name.ToString() 这里奇怪的是,如果我打破并观看查询(//x.Category.Name.ToString())其实我可以找到连接类别的对象,但怎么样,如果可能的话,我可以用它在我的肛方法?

+1

不'x.Category.Name'有什么数据类型? –

+0

请定义“不起作用”。什么***正好发生?如果抛出异常,那么***确切的***消息是什么? (并且在Lasse的问题之间读取:是否它可能是一个'Category'有'Name'实际上是'null'?) –

回答

1

问题是,您首先选择了属性为Id,Name和PartNr的匿名对象。然后你对数据库(使用ToList())执行这个查询,然后你在匿名对象列表上做一个新的选择并尝试访问不在你的匿名对象中的属性。

您应该将该类别包含在匿名对象中,以便您可以在第二次选择中访问它。或者,您应该选择第一个选择查询的最终结构,以便它将针对您的数据库执行。

这将例如工作:

rows = query.Select(x => new { x.Id, x.Name, x.PartNr, x.Category }) 
        .ToList() 
        .Select(x => new 
        { 
         id = x.Id, 
         cell = new string[] { 
         x.Id.ToString(), 
         x.Name.ToString(), 
         x.PartNr.ToString(), 
         x.Category.Name.ToString() 
         } 
        }).ToArray() 

或者您简化查询只有一个对数据库执行:

rows = query.Select(x => new 
     { 
      x.Id, 
      cell = new string[] 
      { 
       x.Id.ToString(), 
       x.Name.ToString(), 
       x.PartNr.ToString(), 
       x.Category.Name.ToString() 
      } 
     }).ToArray() 
+0

* faceplant * 当然,谢谢Wouter! –