将对象转换为特定的类型c#

时间:2018-11-07 06:30:28

标签: c# azure web azure-cosmosdb

我正在用c#编写一个Web应用程序,在其中我查询了Azure中CosmoDB中的数据。此cosmoDB的文档是一些数据结构的Json,这些数据结构已在Web应用程序中定义为模型。问题是,当使查询在数据库中具有不同类型的结构时,我必须将其作为对象类型进行处理,以便稍后将其转换为特定类型并以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>

问题是,当我尝试将Object转换为数据结构ECCE_SuportData时,在HomeController中出现了一个错误:您无法转换类型为'System.Collections.Generic.List`1 [Object。System.Object ]”类型更改为“ todo.Models。 ECCE.ECCE_SupportData'

有人知道我如何将对象转换为这种数据结构吗? 预先感谢。

1 个答案:

答案 0 :(得分:0)

问题的根源在于,实现存储库的方式从根本上是错误的。我知道您正在使用Azure示例,但是这些示例不一定是实现它的最佳方法。静态存储库实现永远无法在现实生活中工作,在现实生活中,您需要处理多种类型的文档。

您需要做的是针对需要操作的每种对象类型创建此存储库的实例。这意味着删除static关键字,并在应用程序的生命周期中将存储库实例注册为单例。

您可以找到here所需的(有点过时但又不错的)实现。

此外,对于最新的CosmosDB相关示例,我强烈建议您使用official CosmosDB .NET Github repository。他们有一个装满样本的文件夹,几乎可以存放任何东西。

但是,如果您想采用更类似于ORM的实现,则还应该查看Cosmonaut

所有代码都将变成这样:

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

完全取决于您的选择,最适合您的要求。

免责声明:我是宇航员的创建者