ASP.NET,C#和匿名类型 - 在手动构建匿名类型时迭代DataTable

时间:2010-01-18 22:36:35

标签: c# asp.net anonymous-types

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

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

无论如何我能做到这一点吗?

亲切的问候

沃尔特

2 个答案:

答案 0 :(得分:2)

我认为检查空值可能是在服务器端有意义的。道格拉斯描述的方法是可行的方法。另一个是在构建匿名类型集合时处理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>

答案 1 :(得分:1)

有时候我发现使用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上执行预处理。

希望这有帮助。