2009-02-09 46 views
3

允許我從頭開始:我是ASP.NET MVC上的n00b。我喜歡它,但我是一個n00b。使用LINQ在ASP.NET MVC中傳遞數據 - 憨態可012

我想從LINQ查詢中傳回「複雜」數據。我知道如何使用數據上下文,然後在我發回數據時將這些數據進行轉換,但是當我執行一個更復雜的LINQ查詢(返回匿名類型)時,就會出現問題。

我看到有人提出類似問題(MVC LINQ to SQL Table Join Record Display),答案似乎是創建一個新的數據類型來捕獲LINQ查詢中的數據。我不明白我可以在控制器中創建一個var類型,並訪問控制器中的成員字段,但是如果我想將該var傳回給View,我需要爲此創建一個新的類。

這裏是我的控制器代碼:

var vrGoodResults1 = from records in db.Words 
         group records by records.word1 into g 
         select new 
         { 
          strWord = g.Key, 
          intWordCount = g.Count() 
         }; 
      ViewData["GoodWords"] = vrGoodResults1; 
      return View(); 

和視圖看起來是這樣的:

<% foreach (var kvp in (IEnumerable)ViewData["GoodWords"]) %> 
<% { %> 
     <%= String.Format("{0} was used times", kvp) %> <br /> 
<% } %> 

,輸出:

{strWord = cool, intWordCount = 2 } was used times 
{strWord = educated, intWordCount = 1 } was used times 
{strWord = great, intWordCount = 1 } was used times 
{strWord = smart, intWordCount = 6 } was used times 
{strWord = strong, intWordCount = 2 } was used times 
{strWord = super smart, intWordCount = 2 } was used times 

所以數據越來越來查看,但我不能通過在LINQ隊列中分配的字段名稱來引用數據RY。當我嘗試傾銷kvp.GetType(),我得到:

<>f__AnonymousType1`2[System.String,System.Int32] 

所有我想要做的是沿着線的東西:

<%= String.Format("{0} was used {1} times", kvp.strWord, kvp.intWordCount) %> <br /> 

但我對KVP得到一個編譯錯誤。 strWord。

error CS1061: 'object' does not contain a definition for 'strWord' and no extension method 'strWord' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?) 

如果我插入下面的代碼到我的控制器:

foreach (var kvp in vrGoodResults1) 
{ 
    string strNew = kvp.strWord; 
} 

我可以引用我的可變KVP的字段而不編譯錯誤。所以當從Controller傳遞給View時,有些東西會迷失方向。我忘了在某個地方包括什麼東西?也許是「使用」或在「< @ Page」指令中,我忘記繼承某些內容了嗎?

當您使用LINQ清除數據上下文時,只需設置IEnumerable <「數據類型」>其中「數據類型」=您的數據上下文類型,並且您都很好。當你將數據集減少到LINQ中的新內容時,我無法相信最好的答案是創建一個新類,以便我可以在View中使用它。

回答

3

var是用於在當前作用域中聲明類型的編譯器快捷方式。它不會爲.NET運行時添加任何動態功能,因此範圍之外的代碼將該對象視爲「System.Object」,因爲這是視圖代碼所瞭解的繼承鏈中最具體的類型。

如果你想傳遞元組對象,你應該創建一個真實的類;這就是你在var之前必須做的事情,所以它不像你現在要做的那樣丟失任何東西:)

+0

好答案...謝謝!然而,如果你改變你的查詢,你將不得不重構一個類,這對我來說確實很愚蠢。有關進行查詢測試的任何建議? – 2009-02-09 18:04:50

2

這裏最好的答案就是就是來創建一個新類型。你可以從objectsee here)獲得匿名類型,但它很醜,很脆。不要這樣做!

您可以使用反射(kvp.GetType().GetProperty("strWord").GetValue(kvp, null)) - 但這也不是一個好主意。

在這種情況下 - 也許使用原來的KeyValuePair<string,int>選擇?或者你自己的Tuple<T1,T2>

0

不要害怕新的類型。他們還提供很多其他好處,特別是在測試時。使用新的屬性語法,你的類將只有你有屬性的行數。你也可以失去那種可怕的匈牙利符號。 Int and str - yuk

+0

你能告訴我在90年代初學會了如何編碼嗎? :) – 2009-02-09 18:07:56

相關問題