如何使用EF 6在web api odata中实现模型的计算字段

时间:2014-07-11 17:44:12

标签: api web odata entity-framework-6

我正在创建一个web api odata控制器,一切顺利,直到我尝试将派生字段添加到模型中。我不希望该字段存在于数据库中,并且该字段不需要是可查询的。

给定模型;

public class Foo
{
    public Int64 Id { get; set; }
    public string SomeDatabaseSourcedField{ get; set; }
    public string SomeDerivedField{ get; set; }
}

如果我有一个像这样的控制器;

private FooDbContext db = new FooDbContext();

[Queryable]
public IQueryable<Foo> GetFoo()
{        
    return db.Foo;
}

如何设置SomeDerivedField的价值?

注意:我已尝试将该字段标记为not mapped但似乎该字段在api调用中未返回。

1 个答案:

答案 0 :(得分:3)

这是我的答案,我使用的是odata v4。 http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/ 我已成功获得响应中的派生字段。

首先,定义一个派生自foo的类:

public class MyFoo:Foo
{
    public string SomeDerivedField{ get; set; }
}

其次,构建edm模型:

    public static IEdmModel GetModel()
    {
        ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<MyFoo>("Foo");
        builder.EntityType<MyFoo>().DerivesFromNothing();

        builder.Namespace = typeof(MyFoo).Namespace;

        return builder.GetEdmModel();
    }

第三,检索数据:

    public IHttpActionResult Get()
    {
        IQueryable<MyFoo> foos= db.Foos.Select(
            t => new MyFoo()
            {
                Id = t.Id,
                Name = t.Name,
                SomeDerivedField= t.Name + SqlFunctions.StringConvert((double)t.Id)
            });
        return Ok(foos);
    }