可查询属性允许获得一些属性而不是所有属性

时间:2014-03-13 21:41:39

标签: asp.net-web-api odata

我有一个web api 2应用程序,在我的控制器中,我有这个代码:

    [Queryable]
    public IQueryable<Title> GetTitles()
    {
        return db.Titles;
    }

这是标题实体:

public partial class Title
{
    public Title()
    {
        this.People = new HashSet<Person>();
    }

    public short Id { get; set; }
    public string NameT { get; set; }

    public virtual ICollection<Person> People { get; set; }
}

当人们查询标题时,他们必须只获得“NameT”属性。但现在他们得到了所有的财产。是的,我知道$ select,但我想要另一种方式。意味着即使他们使用$ select,他们也不应该获得“Id”属性。如果我需要提供更多信息,请告诉我。感谢。

3 个答案:

答案 0 :(得分:0)

也许您可以在行动中GetTitles()过滤,例如:

[Queryable]
public IQueryable<Title> GetTitles()
{
    return db.Titles.Select(t=>t.Name);
}

答案 1 :(得分:0)

使用ODataController时,有两种方法可以解决您的问题。但是,它们不会影响ApiController非查询部分。

在这种情况下,你可以试试Zoe的建议。

1.使用模型构建器构建模型时忽略这些属性。

builder.EntityType<Title>().Ignore(title => title.Id);

2.在这些属性上添加忽略成员属性。

[IgnoreDataMember] public short Id { get; set; }

除此之外,我们还支持在Web API 2.2中为OData v4.0限制允许的查询集。

http://blogs.msdn.com/b/webdev/archive/2014/03/13/getting-started-with-asp-net-web-api-2-2-for-odata-v4-0.aspx

我们可以在模型中的类型属性上使用Unsortable,NonFilterable,NotExpandable或NotNavigable等属性,或者我们可以在模型构建器中显式配置它。

答案 2 :(得分:0)

使用ODataModelBuilder类而不是ODataConventionModelBuilder类。

var modelBuilder = new ODataModelBuilder();

var titles = modelBuilder.EntitySet<Title>("titles");

var title = titles.EntityType;

title.HasKey(x => x.Id);
title.Ignore(x => x.Id);
title.Property(x => x.TName);

titles.HasIdLink(x => { return x.GenerateSelfLink(true); }, true);
config.Routes.MapODataRoute("odata", "odata", modelBuilder.GetEdmModel());