2010-01-18 56 views
6

我目前正在使用ASP.NET,jQuery和JSON實現客戶端分頁解決方案。ASP.NET,C#和匿名類型 - 在手動構建匿名類型時遍歷數據表

我一直跟着從encosia的優秀文章:http://encosia.com/2008/08/20/easily-build-powerful-client-side-ajax-paging-using-jquery/

在我的Web方法我從數據庫中檢索我的數據作爲一個DataTable:

DataTable categoryProducts = ProductViewerAccess.GetCategoryProducts 
     ("AA", 4, 0, Page.ToString(), out howManyPages, "FALSE", 0, "CostPrice", "asc", destinationList); 

我然後檢索DataTable中的數據轉換成匿名類型:

var feeds = 
     from feed in categoryProducts.AsEnumerable() 
     select new 
     { 
      Description = feed.Field<string>("description"), 
      MfPartNo = feed.Field<string>("MfPN"), 
      Inventory = feed.Field<Int32>("Inventory") 
     }; 

匿名類型,然後從Web方法在客戶端返回:

return feeds.Take(PageSize);

模板然後提取和顯示領域:

<tbody> 
    {#foreach $T.d as post} 
    <tr> 
     <td> 
     {$T.post.Description} 
     <p>Mfr#: {$T.post.MfPartNo}</p> 
     </td> 
     <td>{$T.post.Inventory}</td> 
    </tr> 
    {#/for} 
    </tbody> 

這一切的偉大工程。但是,我想擴展代碼以執行一些評估檢查(例如,檢查DataTable中的各列不是NULL)和其他預處理(例如,調用各種函數來構建基於在DataTable的結果行作爲匿名類型返回給客戶端之前,圖像ID(DataTable中的另一列未在代碼片段中顯示))。

基本上,我想遍歷DataTable,執行評估檢查和預處理,同時手動構建我的匿名類型。或者也許有更好的方法來實現這一目標?

無論如何我能做到這一點嗎?

親切的問候

沃爾特

回答

2

我認爲檢查空值可能是在服務器端有意義的東西。道格拉斯描述的方法是可行的。另一個是處理你正在構建匿名類型的集合空問題:

var feeds = 
    from feed in categoryProducts.AsEnumerable() 
    select new 
    { 
     Description = feed.Field<string>("description"), 
     MfPartNo = feed.Field<string>("MfPN"), 
     // Return 0 if the inventory value is null. 
     Inventory = (int?)feed.Field("Inventory") ?? 0 
    }; 

ScottGu對using the null coalescing operator to handle nulls concisely好的帖子,如上圖所示。

至於建立鏈接,這是我可能會建議在客戶端模板中做的事情。這樣可以消除以JSON方式發送的相當多的冗餘數據。像這樣的東西,例如:

<tbody> 
    {#foreach $T.d as post} 
    <tr> 
    <td> 
     <a href="/url/to/details.aspx?id={$T.post.ID}">{$T.post.Description}</a> 
     <p>Mfr#: {$T.post.MfPartNo}</p> 
    </td> 
    <td>{$T.post.Inventory}</td> 
    </tr> 
    {#/for} 
</tbody> 
1

有時候,我發現它有助於使用LINQ to儲值我需要在隨後的查詢中使用使用「讓」的關鍵字。稍後我可以使用這個變量來進行簡單的空檢查或其他事情。例如:

var feeds = 
    from feed in categoryProducts.AsEnumerable() 
    let MfPN = feed.Field<string>("MfPN") 
    // Get image url if MfPN is not null, else return default image url. 
    let Url = !string.IsNullOrEmpty(MfPN) ? GetImgUrl(MfPN) : 「DefaultImage.jpg」 
     select new 
     { 
      Description = feed.Field<string>("description"), 
      MfPartNo = MfPN, 
      Inventory = feed.Field<Int32>("Inventory"), 
      ImageUrl = Url 
     }; 

我能想到的,如果過於簡單調用LINQ查詢之前在數據表執行的預處理唯一的其他東西。

希望這會有所幫助。