【问题标题】:Return a single entity from OData - .Net从 OData 返回单个实体 - .Net
【发布时间】:2014-07-02 19:35:36
【问题描述】:

我需要对 OData 服务进行请求,该服务将检索单个实体,该请求应如下所示: /EntitySet(par1=value1,…,parn=valuen)

但是,我的 LINQ 生成的用于获取条目的查询如下所示: /EntitySet()?$filter=(par1 eq value1) and (par2 eq value2) and ... (parn eq valuen)

这当然是有效的。但是服务器不允许。它只与第一个选项一致,即括号中的条件。

有什么我可以做的吗?手动创建查询 URL 会很可惜...

代码如下:

        var context = new CHART_SRV_Entities(oDataUri);

        var query = context.ApplicationData.Where(ad =>
            ad.institution == "1" &&
            ad.patientId == "2000118" &&
            ad.caseId == "2488");

        DataServiceCollection<ApplicationData> data = new DataServiceCollection<ApplicationData>(context);

        data.LoadCompleted += (s, args) =>
            {
                if (args.Error == null)
                {
                    if (data.Continuation != null)
                    {
                        data.LoadNextPartialSetAsync();
                    }
                    else
                    {
                        var result = data;
                    }
                }
                else
                {
                    MessageBox.Show(args.Error.Message);
                }
            };

        data.LoadAsync(query);

更新:使用 CreateQuery here 实现了“括号请求”。但是,这是一个同步调用。关于如何使其异步的任何想法?

Update2: 似乎我想要实现的是 OData 复合键查找。有这个OData library 可以做到这一点,但我很难相信微软工具集无法做到这一点。

【问题讨论】:

  • 尝试删除实体集“~/EntitySet?$filter=(par1 eq value1) and (par2 eq value2) and ... (parn eq valuen)”之后的括号。你的服务是用什么构建的?
  • 删除括号从服务器返回相同的响应:方法'APPLICATIONDATA_GET_ENTITYSET'未在数据提供者类中实现它是SAP网关服务btw

标签: c# .net linq odata


【解决方案1】:

只允许关键属性出现在实体集名称后面的括号中。 如果您使用非键属性来查找条目,则必须使用过滤器。这就是客户端的工作方式,也是正确的行为。

如果可以的话,我建议您自定义客户端代码或更新服务代码以支持过滤器。

【讨论】:

  • 实体是在我添加服务引用时自动创建的。生成的代码如下所示: [global::System.Data.Services.Common.EntitySetAttribute("ApplicationData")] [global::System.Data.Services.Common.DataServiceKeyAttribute("institution", "refresh", "wdConfigId "、"defaultLayoutId"、"patientId"、"caseId"、"dateFrom"、"dateTo"、"layoutId"、"guid"、"documentOu"、"movementId")] 公共部分类 ApplicationData : global::System.ComponentModel .INotifyPropertyChanged 我不确定我可以改变什么...
  • 有多个键,但您仅通过 where 子句指定其中三个。这意味着您不是要查找单个实体,而是要查找实体的集合。所以客户端代码必须使用过滤器来做你告诉它做的事情。如果要返回单个实体,则必须在 where 中指定所有关键属性。
猜你喜欢
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-17
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
相关资源
最近更新 更多