Tag: odata

Web API OData:您如何在单个实体上进行扩展?

我已经多次阅读这 两篇文章 ,试图找出在单个实体上使用$expand查询选项的方法,但是在我尝试过的每一种方式中,我似乎都无法做到这行得通。 所有其他查询选项都有效, $expand目前也适用于收集结果。 模型 :玩家实体具有名为Stats的导航属性,其中每个对象包含给定年份的该玩家的统计数据。 我用这种方式设置了OData: config.EnableQuerySupport(); ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); modelBuilder.EntitySet(“OPlayer”); modelBuilder.EntitySet(“OPlayerStats”); Microsoft.Data.Edm.IEdmModel model = modelBuilder.GetEdmModel(); config.Routes.MapODataRoute(“ODataRoute”, “odata”, model); 最初,我以这种方式设置了我的控制器: public class OPlayerController : EntitySetController { private readonly DatabaseContext _db = new DatabaseContext(); protected override Player GetEntityByKey(int key) { return _db.Players.FirstOrDefault(p => p.PlayerId == key); } public override IQueryable Get() { […]

WebAPI OData $格式为xml

对于我的WebAPI OData应用程序,我试图让我的客户端(浏览器)决定数据输出应该是什么格式。 由于$ format尚未在WebAPI OData中实现,我在这里使用Raghuramn的示例: https ://gist.github.com/raghuramn/5556691 var queryParams = request.GetQueryNameValuePairs(); var dollarFormat = queryParams.Where(kvp => kvp.Key == “$format”).Select(kvp => kvp.Value).FirstOrDefault(); if (dollarFormat != null) { request.Headers.Accept.Clear(); request.Headers.Accept.Add(MediaTypeWithQualityHeaderValue.Parse(dollarFormat)); // remove $format from the request. request.Properties[HttpPropertyKeys.RequestQueryNameValuePairsKey] = queryParams.Where(kvp => kvp.Key != “$format”); } 这适用于JSON($ format = application / json; odata = fullmetadata)和JSON light(format = application / […]

OData $ expand,DTO和Entity Framework

我有一个基本的WebApi服务设置,数据库首先设置了EF DataModel。 我正在运行WebApi,EF6和WebApi OData包的每晚构建。 (WebApi:5.1.0-alpha1,EF:6.1.0-alpha1,WebApi OData:5.1.0-alpha1) 该数据库有两个表:产品和供应商。 产品可以有一个供应商。 供应商可以拥有多种产品。 我还创建了两个DTO类: public class Supplier { [Key] public int Id { get; set; } public string Name { get; set; } public virtual IQueryable Products { get; set; } } public class Product { [Key] public int Id { get; set; } public string Name { get; […]

Web Api 2.2 OData V4function路由

我有一个使用OData v4的Web Api 2.2项目。 正常的EntitySet配置可以根据需要使用所有http谓词。 我遇到问题的地方是尝试公开自定义函数。 我开始尝试做一些与标准示例不同的事情,但我一直支持尝试使基本示例函数正常工作。 这是我的启动配置(直接来自MS示例): using System; using System.Collections.Generic; using System.Linq; using System.Web.Http; using System.Web.OData.Builder; using System.Web.OData.Extensions; namespace Test.Service { public static class WebApiConfig { public static void Register(HttpConfiguration config) { // other entitysets that don’t have functions builder.EntitySet(“Products”); builder.Namespace = “ProductService”; builder.EntityType().Collection .Function(“MostExpensive”) .Returns(); config.MapODataServiceRoute( “odataroute” , “odata” , builder.GetEdmModel() ); […]

使用WebApi和映射模型实现OData

我正在尝试在WebApi中实现OData。 我正在使用存储库模式和EF5(在后端),这仍然与我找到的所有示例一致。 这是事情变得不稳定的地方。 我试图隐藏EF生成的类隐藏在控制器中使用AutoMapper映射的模型后面。 我看到的例子似乎都归还了回购中的任何内容 我不想在控制器中但在存储库中应用OData参数(已映射的结果)以保留延迟执行的值。 我可以将ODataCriteria传递到存储库中,但是当我尝试Appy时,我得到一个错误,因为看起来选项/结果是从表示层而不是IQueryable 键入IQueryable 。 我在另一篇文章中看到其他人没有注意到这一点,但是,它只是该post的一小部分,似乎没有帮助。 还有其他人处理过这件事吗? 我真的不想暴露EF类。 哦,我先使用DB。 提前致谢…

如何转义要在OData查询中使用的单引号?

我正在使用OData来查询我的数据库。 当“adapterName”只包含文本时,以下代码行正常工作。 ds.query(‘/DataAdapters?$filter=Name eq \” + adapterName + ‘\”, ifmgr_CreateAdapter_Step1, onGenericFailure, ”); 如果“adapterName”包含单引号则失败。 我尝试使用以下代码转义单引号: adapterName = adapterName.replace(/\’/g, ‘\\\”); 虽然这正确地逃避了用户定义的文本,但该函数仍然失败。 谁能告诉我查询中文本的正确格式是什么?

使用WebApi进行OData分页($ inlinecount)

我正在使用OData分页从web api调用返回的一长串项目。 我可以通过url使用开始和结束索引过滤数据。 我的问题是,我怎么知道物品的总数? 所以我可以在我的移动设备上显示第1页(共3项)(20项),该设备调用web api。

使用$ expand请求控制返回的内容

因此,使用ODataController ,您可以控制返回的内容,如果有人执行/odata/Foos(42)/Bars ,因为您将在FoosController上调用, FoosController所示: public IQueryable GetBars([FromODataUri] int key) { } 但是如果你想控制什么时候有什么东西/odata/Foos?$expand=Bars ? 你怎么处理那件事呢? 它会触发此方法: public IQueryable GetFoos() { } 而且我认为它只会在您返回的IQueryable上执行.Include(“Bars”) ,所以…我如何获得更多控制权? 特别是,我如何以OData不破坏的方式进行操作(例如$ select,$ orderby,$ top等继续工作。)

Json.Net DeserializeObject失败,只有OData.Delta – 整数

这个问题正在影响我的ASP.Net WebApi补丁方法,看起来很像这样: public MyModel Patch(int id, [FromBody]Delta newRecord){/*stuff here*/} 但这不是WebApi的问题 – 失败发生在Json.Net和OData.Delta之间。 问题是JsonConvert.DeserializeObject没有看到OData.Delta对象的整数,我想知道是否有可以应用的解决方法或修复。 更新:在Json.Net库中编写了代码(请参阅下面的右下角),以解决此问题。 只需将它包含在下一次更新中(如果James Newton-King允许的话) 更新2:经过进一步测试,我决定最好的做法是停止使用OData.Delta并自己编写(见答案) 用于certificate问题存在的unit testing(为了清楚起见,使用下面的语句) 测试1:使用int(Int32)失败: class TestObjWithInt { public int Int { get; set; } } [TestMethod] public void IsApplied_When_IntIsDeserializedToDelta() { string testData = “{\”Int\”:1}”; var deserializedDelta = JsonConvert.DeserializeObject<Delta>(testData); var result = deserializedDelta.GetChangedPropertyNames().Contains(“Int”); Assert.IsTrue(result); } 测试2:长成功(Int64) class TestObjWithLong { public […]

在webapi中使用OData来获取仅在运行时知道的属性

假设我有一个非常简单的类型,我想在OData feed上公开它作为使用.NET C#webapi控制器的集合的一部分: public class Image { /// /// Get the name of the image. /// public string Name { get; set; } public int Id { get; set; } internal System.IO.Stream GetProperty(string p) { throw new System.NotImplementedException(); } private Dictionary propBag = new Dictionary(); internal string GetIt(string p) { return propBag[p]; } } 在我的WebApiConfig.cs中,我做了标准配置: […]