【问题标题】:How to include read-only property in an OData query如何在 OData 查询中包含只读属性
【发布时间】:2016-11-18 21:34:40
【问题描述】:

我有以下型号:

public class Employee
{
  public int EmployeeId { get; set; }

  public string Name { get; set; }

  [...]

  public int OfficeId { get; set; }      

  public string OfficeInfo
  {
    get { return Office.Info; }
  }

  public Office Office { get; set; }
}

public class Office
{
  public int OfficeId { get; set; }

  public string Info { get; set; }
}

我在客户端有一个网格,我想用 Employee 实例提供哪些行,包括其中一列中的 OfficeInfo,所以我通过以下查询使用它:

"/odata/Employees?$expand=Office&$select=EmployeeId,Name,OfficeInfo"

我在 IEdmModel 中注册了两个实体:

private static IEdmModel GetEDMModel()
{
  ODataModelBuilder builder = new ODataConventionModelBuilder();

  builder.EntitySet<Employee>("Employees");
  builder.EntitySet<Office>("Offices");

  [...]
}

我的 Get 操作如下所示:

[EnableQuery]
public IQueryable<Employees> Get()
{
   [...]
}

但我不断收到此异常:

“在类型‘Xds.Entities.Employee’上找不到名为‘OfficeInfo’的属性”

我在这里错过了什么?

【问题讨论】:

  • 我知道它不能回答你的问题,但有什么阻止你改用Employee.Office.Info 吗?

标签: c# asp.net-web-api odata


【解决方案1】:

您可以根据需要标记属性OfficeInfo 或显式添加此属性:

  • 根据需要注意:

    builder
          .EntitySet<Employee>("Employees")
          .EntityType
          .Property(_ => _.OfficeInfo)
          .IsRequired();
    
  • 显式添加:

    builder
          .EntitySet<Employee>("Employees")
          .EntityType
          .Property(_ => _.OfficeInfo)
          .AddedExplicitly = true;
    

【讨论】:

  • 应用您的解决方案后,现在我得到一个不同的错误:System.NotSupportedException LINQ to Entities 不支持指定的类型成员“OfficeInfo”。仅支持初始化器、实体成员和实体导航属性。
  • @slashCoder 我假设,OfficeInfo 列在某些 Linq 子句中的 Get 方法中使用,例如 employees.Where(_ =&gt; _.OfficeInfo == "?")employees.OrderBy(_ =&gt; _.OfficeInfo)。这是不允许的。而是使用导航属性“Office”,例如 employees.Where(_ =&gt; _.Office.Info == "?")
【解决方案2】:

您可以检查您的模型元数据并查看“Xds.Entities.Employee”类型下是否出现以下内容。

<Property Name="OfficeInfo" Type="Edm.String" />

因为它是一个只读属性,你应该打开isQueryCompositionMode让它显示在模型中,就像(可以在那里传递真正的HttpConfiguration):

ODataModelBuilder builder = new ODataConventionModelBuilder(new System.Web.Http.HttpConfiguration(), true);

之后,查询应该可以工作了。

请注意,该标志被标记为用于测试目的,但如果您手动验证元数据应该没问题。

【讨论】:

    猜你喜欢
    • 2015-02-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    相关资源
    最近更新 更多