Преобразовать объект в особый тип c # - PullRequest
0 голосов
/ 07 ноября 2018

Я делаю веб-приложение на C #, в котором я проверяю данные в CosmoDB, которые есть в Azure. Этот cosmoDB содержит документы, которые являются Jsons некоторых структур данных, которые я определил в качестве моделей в своем веб-приложении. Проблема заключается в том, что при создании запроса для различных типов структур в базе данных я должен сделать это как тип объекта, чтобы затем преобразовать его в определенный тип и отобразить на экране в виде HTML-кода. На самом деле у меня есть код, который дает вам учебник по Azure, измененный в соответствии с моим приложением.

Код следующий:

namespace todo
{
 using System.Web.Mvc;
 using System.Web.Optimization;
 using System.Web.Routing;
 using System.Collections;
 using System;
 using System.Collections.Generic;
 using System.Configuration;
 using System.Linq;

 public class MvcApplication : System.Web.HttpApplication
 {
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

        DocumentDBRepository<Object>.Initialize();
    }
  }
}

Тогда контроллер Home делает:

    [ActionName("ECCE")]
    public async Task<ActionResult> ECCEAsync(string id)
    {
        var items = await DocumentDBRepository<Object>.GetItemsAsync(id);
        return View((ECCE_SupportData)items);
    }

Где класс DocumentDBRepository составляет:

        public static async Task<IEnumerable<T>> GetItemsAsync(string collectionId)
    {
        List<T> results = new List<T>();

        try
        {
            IDocumentQuery<T> query = client.CreateDocumentQuery<T>(
                UriFactory.CreateDocumentCollectionUri(DatabaseId, collectionId),
                new FeedOptions { MaxItemCount = -1, EnableCrossPartitionQuery = true })
                .AsDocumentQuery();

            while (query.HasMoreResults)
            {
                results.AddRange(await query.ExecuteNextAsync<T>());
            }
        }
        catch (Exception)
        {
            return results;
        }

        return results;
    }

Чтобы позже передать список объектов в html, чтобы увидеть их на экране:

<script type="text/javascript" language="javascript" src="../../Scripts/TableFilter/tablefilter.js"></script>

@model IEnumerable<todo.Models.ECCE.ECCE_SupportData>
@{
    ViewBag.Title = "Data";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
<h2>ECCE Data</h2>

@if (Model.Count() != 0)
{
    <table class="table" id="ECCETable">
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.ECCE_CnfStatus)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ECCE_ComsStatus.ComStatus)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ECCE_ComsStatus.UltimoError)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ECCE_Status.AppVersion.IdApp)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ECCE_Status.AppVersion.ReqVersion)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ECCE_Status.AppVersion.SwVersion)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ECCE_Status.AppStatus)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.ECCE_UvStatus.NumUVs)
            </th>
            
    </table>

Проблема в том, что в HomeController при попытке преобразовать объект в мою структуру данных ECCE_SuportData выдает ошибку: вы не можете преобразовать объект типа 'System.Collections.Generic.List`1 [System.Object ] к типу. todo.Models. ECCE.ECCE_SupportData '

Кто-нибудь знает, как я могу преобразовать объект в эту структуру данных? Заранее спасибо.

1 Ответ

0 голосов
/ 07 ноября 2018

Корень проблемы в том, что способ реализации репозитория в корне неверен. Я знаю, что вы используете образец Azure, но эти примеры не обязательно являются лучшим способом его реализации. Реализация статического репозитория никогда не будет работать в реальном сценарии, когда у вас есть несколько типов документов, с которыми вам нужно работать.

Что вам нужно сделать, это создать экземпляр этого репозитория для каждого типа объекта, с которым вам нужно работать. Это означало бы удаление ключевых слов static и регистрацию экземпляра хранилища в качестве одиночного файла на весь срок службы вашего приложения.

Вы можете найти (немного устаревшую, но) достойную реализацию того, что вам нужно сделать здесь .

Кроме того, для получения актуальных примеров, связанных с CosmosDB, я настоятельно рекомендую вам использовать официальный репозиторий CosmosDB .NET Github . У них есть папка с образцами для чего угодно.

Однако, если вы хотите перейти к более ORM-подобной реализации, вам также следует взглянуть на Космонавт .

С этим весь ваш код станет таким:

var items = await cosmoStore.Query().ToListAsync;

Выбор за вами полностью и то, что лучше всего соответствует вашим требованиям.

Отказ от ответственности: я создатель Космонавта

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...