ASP.NET, C # и анонимные типы - перебирайте таблицу DataTable при создании анонимного типа вручную - PullRequest
6 голосов
/ 19 января 2010

В настоящее время я внедряю решение для подкачки на стороне клиента, используя ASP.NET, jQuery и JSON.

Я следил за отличной статьей от Encosia: http://encosia.com/2008/08/20/easily-build-powerful-client-side-ajax-paging-using-jquery/

В моем веб-методе я извлекаю свои данные из базы данных в виде таблицы данных:

    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")
        };

Затем анонимный тип возвращается из веб-метода на клиентскую сторону:

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-адреса изображения на основе ID изображения - это еще один столбец в DataTable, не показанный во фрагменте кода), прежде чем я возвращу результирующие строки DataTable как анонимный тип на стороне клиента.

По сути, я хочу перебрать DataTable, выполнить проверку и предварительную обработку, одновременно создавая свой анонимный тип вручную. Или, может быть, есть лучший способ добиться этого?

Могу ли я в любом случае этого добиться?

С уважением

Walter

Ответы [ 2 ]

2 голосов
/ 19 января 2010

Я думаю, что проверка на нулевые значения, вероятно, имеет смысл на стороне сервера. Подход, который описывает Дуглас, является одним выполнимым. Другой способ - решить нулевую проблему при создании коллекции анонимных типов:

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 имеет хороший пост на , использующий оператор объединения нулей для краткой обработки нулей , как показано выше.

Что касается построения ссылок, я бы, вероятно, предложил бы это сделать в шаблоне на стороне клиента. Таким образом, вы можете устранить довольно много избыточных данных, отправленных в 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 голос
/ 19 января 2010

Иногда я нахожу полезным использовать ключевое слово let, используя LINQ для хранения значения, которое мне понадобится позже в запросе. Я могу использовать эту переменную позже для простых проверок нуля или других вещей. Например:

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
        };

Единственное, что я могу подумать, если это слишком просто, выполнить предварительную обработку DataTable перед вызовом LINQ Query.

Надеюсь, это поможет.

...