访问包含的对象

本文关键字:对象 包含 访问 | 更新日期: 2023-09-27 18:17:03

我正在使用一个新的ASP。NET MVC3项目,似乎我错过了一些我的LINQ技能。

我正在为Json"调用"格式化数据,以便在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()),我实际上可以找到附加的类别对象,但如何,如果可能的话,我可以在我的ano方法中使用它?

访问包含的对象

问题是您首先选择了一个具有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()
相关文章: