【问题标题】:ASP.NET, C# and Anonymous Types - Iterate through a DataTable while Manually Building an Anonymous TypeASP.NET、C# 和匿名类型 - 在手动构建匿名类型的同时迭代数据表
【发布时间】:2010-01-18 22:36:34
【问题描述】:

我目前正在使用 ASP.NET、jQuery 和 JSON 实现客户端分页解决方案。

一直在关注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)和其他预处理(例如,调用各种函数以基于图像 ID - 这是代码片段中未显示的 DataTable 中的另一列),然后我将 DataTable 的结果行作为匿名类型返回给客户端。

基本上,我想遍历 DataTable,执行评估检查和预处理,同时手动构建我的匿名类型。或者也许有更好的方法来实现这一点?

有没有我可以做到这一点?

亲切的问候

沃尔特

【问题讨论】:

    标签: c# asp.net anonymous-types


    【解决方案1】:

    我认为检查空值可能在服务器端是有意义的。道格拉斯描述的方法是一种可行的方法。另一个是在构建匿名类型集合时处理 null 问题:

    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>
    

    【讨论】:

      【解决方案2】:

      有时我发现使用 LINQ 的“let”关键字来存储我稍后需要在查询中使用的值很有帮助。稍后我可以将这个变量用于简单的空值检查或其他事情。例如:

      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 查询之前对 DataTable 执行预处理过于简单。

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-28
        相关资源
        最近更新 更多