2011-12-08 98 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! –