我正在用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'
有人知道我如何将对象转换为这种数据结构吗? 预先感谢。
答案 0 :(得分:0)
问题的根源在于,实现存储库的方式从根本上是错误的。我知道您正在使用Azure示例,但是这些示例不一定是实现它的最佳方法。静态存储库实现永远无法在现实生活中工作,在现实生活中,您需要处理多种类型的文档。
您需要做的是针对需要操作的每种对象类型创建此存储库的实例。这意味着删除static
关键字,并在应用程序的生命周期中将存储库实例注册为单例。
您可以找到here所需的(有点过时但又不错的)实现。
此外,对于最新的CosmosDB相关示例,我强烈建议您使用official CosmosDB .NET Github repository。他们有一个装满样本的文件夹,几乎可以存放任何东西。
但是,如果您想采用更类似于ORM的实现,则还应该查看Cosmonaut。
所有代码都将变成这样:
var items = await cosmoStore.Query().ToListAsync;
完全取决于您的选择,最适合您的要求。
免责声明:我是宇航员的创建者