标签: odata-v4

无法返回对象

我想通过它的名字找到它来返回这个对象:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
    public string Category { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

控制器方法是:

[HttpGet]
[ODataRoute("Products/ProductService.GetByName(Name={name})")]
public IHttpActionResult GetByName([FromODataUri]string name)
{
    Product product = _db.Products.Where(x => x.Name.Equals(name, StringComparison.OrdinalIgnoreCase)).SingleOrDefault();
    if (product == null)
    {
        return NotFound();
    }

    return Ok(product);
}
Run Code Online (Sandbox Code Playgroud)

WebApiConfig.Register()方法是:

public static void Register(HttpConfiguration config)
{
    ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
    builder.EntitySet<Product>("Products");

    builder.Namespace = "ProductService";
    builder.EntityType<Product>().Collection.Function("GetByName").Returns<Product>().Parameter<string>("Name");

    config.MapODataServiceRoute(routeName: …
Run Code Online (Sandbox Code Playgroud)

c# odata odata-v4

5
推荐指数
1
解决办法
1516
查看次数

PageSize和MaxTop之间的区别

[EnableQuery(PageSize=20)]和之间有什么区别[EnableQuery(MaxTop=20)]

据我所知,他们两个都为结果设置了最大限制。

调用GET odata/Products?$top=100它们两个都只给我20个结果。

c# odata asp.net-web-api-odata odata-v4

5
推荐指数
2
解决办法
2879
查看次数

OData V4 $expand 嵌套 $filter 和 $orderby -- 在 expand 内组合 $filter 和 $orderby

我目前有一个 OData V4 服务,它具有以下模型。
“类别”——“代码”
对于每个类别,可以有许多代码。

我需要 $expand the Codes, $filter where Active = true 然后 $orderby Codes.Description。

目前,以下无需订购即可正常工作。

odata/Categories?$expand=Codes($filter=Active eq true)

这不起作用。

odata/Categories?$expand=Codes($filter=Active eq true&$orderby=Description)

我收到“URI 中指定的查询无效。位置 12 处的语法错误。” &“'描述)'中位置 12 处的语法错误。”

基本上它将“描述”之后的最后一个“)”作为错误读取。

odata asp.net-web-api2 odata-v4

5
推荐指数
1
解决办法
6037
查看次数

OData V4使用词汇注释来传递数据注释

有谁知道如何在OData V4的metatdata中设置/读取基于词汇的注释来定义最大字符串长度之类的内容?

有一篇文章“ 客户端注释支持”,但没有显示任何示例代码,我不确定100%是否他们甚至在谈论数据注释。
它具有如下代码:

var person = dsc.People.ByKey("russellwhyte").GetValue();

// Try to get an annotation for a property
dsc.TryGetAnnotation<Func<ObservableCollection<string>>, string>(() => person.Emails, fullQualifiedTermName, qualifier, out annotation);
Run Code Online (Sandbox Code Playgroud)

但是它没有解释“ fullQualifiedTermName”或“ qualifier”使用什么。
我添加了“ odata.inculde-annotations = *”,但这似乎无济于事。

我也尝试了以下方法。

dsc.TryGetAnnotation<Func<string>, string>(() => person.FirstName, "System.ComponentModel.DataAnnotations", out annotation);
Run Code Online (Sandbox Code Playgroud)

但这只会返回null。

我从2012年开始在WCF数据服务中找到了“ 词汇表”,其中谈到了对验证元数据的支持。
我要试一下。
我希望在OData V4中有一种简单/更好的方法可以做到这一点。

Update 1
WCF词汇表示例在OData V4中不起作用,因为System.Web.Http.HttpConfiguration中缺少config.AnnotationsBuilder。

OData V4支持此处http://www.odata.org/vocabularies/所定义的词汇表,甚至还提供了我需要的“元数据注释可以为特定属性定义有效值范围”,但是似乎没有任何示例代码除了SAP https://blogs.sap.com/2013/10/07/vocabulary-based-annotations/之外的任何其他文章。

更新2
在查看TripPinService之后,我注意到它们在预算上有一些注释,如下所示。

<Property Name="Budget" Type="Edm.Single" Nullable="false">
    <Annotation Term="Org.OData.Measures.V1.ISOCurrency" String="USD"/>
    <Annotation Term="Org.OData.Measures.V1.Scale" Int="2"/>
</Property>
Run Code Online (Sandbox Code Playgroud)

幸运的是,该项目的源代码是ODataSamples TripPin。
在查看了服务之后,我发现我首先必须创建自己的xml词汇表文件。(ValidationVocabularies.xml) …

wcf-data-services odata data-annotations asp.net-web-api2 odata-v4

5
推荐指数
0
解决办法
1279
查看次数

GROUP BY/Case Asp.Net Web API ODATA的不敏感扩展?

无法在ODATA V4文档中按引用找到组.当我们在URL中通过查询传递组时,它只返回键,而不是实际的分组结果.

关于在Asp.Net ODATA中使用Group by的任何参考,在ODATA Web API的可扩展性点上.我们需要完全掌握如何解析ODATA查询并将其转换为LILNQ到实体查询.

我正在谈论拦截ODATA 查询和执行手动定制的行,例如LINQ to Entities

我正在尝试为Case Sensitivity实现类似的扩展. OData案例Web API中的In-Sensitive过滤?

c# expression-trees odata asp.net-web-api odata-v4

5
推荐指数
1
解决办法
507
查看次数

使用未绑定功能时具有多个路由的OData服务

有谁知道如何在.NET服务中托管OData v4以使用多个路由?

我有以下内容:

config.MapODataServiceRoute("test1", "test1", GetEdmModelTest1());
config.MapODataServiceRoute("test2", "test2", GetEdmModelTest2());
Run Code Online (Sandbox Code Playgroud)

每个GetEdmModel方法都有映射对象.
我可以按照以下方式访问该服务(这很好):

http://testing.com/test1/objects1()
http://testing.com/test2/objects2()

但是,如果我尝试调用以下函数(将无法工作):

[HttpGet]
[ODataRoute("test1/TestFunction1()")]
public int TestFunction1()
{ return 1; }
Run Code Online (Sandbox Code Playgroud)

它会抛出以下错误:

在控制器"测试"动作"TestFunction1"的路径模板"TEST1/TestFunction1()"不是一个有效的OData路径模板.找不到段'test1'的资源.

然而,如果我删除"MapODataServiceRoute"为"测试2",所以只有一个路由,它所有的作品.

如何使用多个路由?

**我已在以下**发布了该问题的完整示例**
https://github.com/OData/WebApi/issues/1223

**我已经尝试了下面列出的OData版本示例以及以下问题**
https://github.com/OData/ODataSamples/tree/master/WebApi/v4/ODataVersioningSample
我之前尝试过"OData版本"示例不工作.似乎未绑定(未绑定是目标)不遵循相同的路由规则是正常的服务调用.

防爆.如果您下载"OData版本"示例并执行以下操作.

  1. 在V1 - > WebApiConfig.cs中添加
    builder.Function(nameof(Controller.ProductsV1Controller.Test)).Returns<string>();
  2. 在V2 - > WebApiConfig.cs中添加
    builder.Function(nameof(Controller.ProductsV2Controller.Test)).Returns<string>();
  3. 在V1 - > ProductsV1Controller.cs中添加
    [HttpGet] [ODataRoute("Test()")] public string Test() { return "V1_Test"; }
  4. 在V2 - > ProductsV2Controller.cs中添加
    [HttpGet] [ODataRoute("Test()")] public string Test() { return "V2_Test"; }

现在打电话给它."/ versionbyroute/v1/Test()"你会得到"V2_Test"

问题是"GetControllerName"在使用未绑定的函数/操作时不知道如何获取控制器.
这就是我尝试"推断"控制器时发现的大多数示例代码失败的原因.

odata asp.net-web-api-routing asp.net-web-api2 odata-v4

5
推荐指数
1
解决办法
1368
查看次数

在 CRUD 操作期间,Odata 适配器是否支持带有“$expand”查询的“Patch”请求?

我有一个以ODataAdaptor作为数据源的组件,现在我想像我为 GET 请求所做的那样使用$expand查询发出Patch请求(因为 GET 请求公开支持 $expand 查询)。但我不知道它是否被接受,或者有没有其他方法可以解决这个问题?

实际请求:http://localhost:49807/odata/Orders(10249)

预期请求:http://localhost:49807/odata/Orders(10249)/ ?$expand=OrderDetail($select=CustomerID)

在补丁请求中使用 $expand 查询。

odata http-patch odata-v4

5
推荐指数
1
解决办法
143
查看次数

Web API 2.2 - 当$ select或$ expand存在时,OData v4 ODataQueryOptions.applyTo()返回null?

我已经设置了一个Web API 2.2 ODataController,这样我就可以手动处理我的OData选项(即没有[EnableQuery]和/或使用ODataQueryOptions参数).但是我遇到了一个看起来像个bug的东西.给出以下代码:

public IHttpActionResult GetEmployees() {
//Get Queryable Item (in this case just an in-memory List made queryable)
  IQueryable<Employee> employees = _Employees.AsQueryable();

//Get Requested URI without querystring (there may be other ways of doing this)
  String newUri = Request.RequestUri.AbsoluteUri;
  if (!String.IsNullOrEmpty(Request.RequestUri.Query)) {
    newUri = newUri.Replace(Request.RequestUri.Query, "");
  }

//Add custom OData querystring (this is for example purposes)
  newUri = String.Format("{0}?$skip={1}&$top={2}", newUri, 1, 1);

//Create new HttpRequestMessage from the updated URI
  HttpRequestMessage newRequest = new HttpRequestMessage(Request.Method, newUri);

//Create new ODataQueryContext …
Run Code Online (Sandbox Code Playgroud)

odata asp.net-web-api asp.net-web-api2 odata-v4

4
推荐指数
1
解决办法
3734
查看次数

无法将类型为"Microsoft.OData.Edm.Csdl.CsdlSemantics.UnresolvedType"的对象强制转换为"Microsoft.OData.Edm.IEdmCollectionType"

在Visual Studio 2013中,我使用Nuget中的OData客户端代码生成器来使用OData V4端点.出乎意料的是,本周t4模板给出了错误:无法将类型为"Microsoft.OData.Edm.Csdl.CsdlSemantics.UnresolvedType"的对象强制转换为"Microsoft.OData.Edm.IEdmCollectionType".

我正在使用7个OData端点,并且只有其中一个在后端需要重新保存*.tt文件的更新.保存后出现错误并将输出*.cs文件留空.然后,我尝试在OData端点保存一个没有模型更改的*.tt文件,以查看它的行为方式.思考过程可能是端点模型的变化可能与客户端代码生成器不兼容.不幸的是,一个失败并产生了一个空白的*.cs文件以及相同的错误.

幸运的是,所有内容都使用git进行版本控制,我能够回滚文件以保持项目正常运行.

将此放在此处以防其他任何人升级他们的OData客户端代码生成器并感到沮丧.

c# visual-studio odata odata-v4

4
推荐指数
1
解决办法
2324
查看次数

oData v4简单来说函数和操作是什么?

在oData 4.0中经常引用动作和函数.我无法得到他们是什么以及他们是如何不同的.功能是否与我们在任何编程语言中的功能相同?什么是行动?以及两者是如何不同的.谢谢你的帮助.

.net odata asp.net-web-api asp.net-web-api2 odata-v4

4
推荐指数
3
解决办法
4170
查看次数