有没有办法修改IQueryable中为OData请求返回的数据?

时间:2014-05-21 04:49:16

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

我有一个Web Api 2服务器,一个Entity Framework数据层和一个BreezeJS客户端。我有一些额外的属性没有映射到我想在查询时设置的数据库。类似的东西:

public class Foo
{
    // Various mapped properties
    // ...

    // These properties are not mapped, and I want
    // to set them on the returned data depending
    // on the current user's roles/authorization
    public bool CanEdit { get; set; }
    public bool CanDelete { get; set; }
}

[BreezeController]
public class BreezeController : BaseController
{
    // ...

    [HttpGet]
    public IQueryable<Foos> Users()
    {
        // How can I set the CanEdit and CanDelete properties
        // here (and only on the data as filtered by the OData
        // queries)?
        return Db.Foos; // Db.Foos is a DbSet<Foo>
    }
}

有没有办法做到这一点?

注意:确定CanEdit / CanDelete的逻辑太复杂,无法包含在LINQ to Entities查询中。

2 个答案:

答案 0 :(得分:0)

我最终通过从QueryHelper派生并挂钩到PostExecuteQuery()来解决这个问题。请参阅我的回答here

答案 1 :(得分:0)

就OData而言,有2个概念适用于您的案例。

第一个是开放类型,它允许您向实体添加未定义的属性。您可以参考此博客How to Use Open Type in OData以获取更多信息。最新的WebApi OData支持开放复杂类型。

第二个是自定义注释,可用于定义与您的实体关联的其他信息。在你的情况下,你可以写&#34; @ Foo.CanEdit:true&#34;进入实体有效负载,告诉客户端您的Foo实体是可编辑的。同样适用于&#34; CanDelete&#34;。

如果您想了解更多信息,我可以提供有关开放式和自定义注释的更多信息。