我正在使用一个新的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方法中使用它吗?
答案 0 :(得分: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()