如何在OData查询中包含只读属性

时间:2016-11-18 21:34:41

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

我有以下型号:

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 /员工$扩大=办公室及安培; $选择= EMPLOYEEID,名称,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'的属性”

我在这里缺少什么?

2 个答案:

答案 0 :(得分:0)

您可以检查您的模型元数据,看看是否会出现在&lt; Xds.Entities.Employee&#39;类型。

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

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

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

之后,查询应该有效。

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

答案 1 :(得分:0)

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

  • 根据需要注明:

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

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