OData $ expand不包括扩展属性为null的实体

时间:2016-09-27 06:08:01

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

我有一个使用WebAPI和EF 6的OData服务构建。我使用流畅的api来创建我的模型。它工作正常,但当我使用$expand时,它会忽略扩展属性为null的实体。

这是一个简化的例子:

public class Customer
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int? AddressId { get set; } // Note that Address is optional
    public Address Address { get; set; }
}

public class Address
{
    public int Id { get; set; }
    public string Street{ get; set; }
}


public class CustomersController : ODataController
{
    [EnableQuery]
    public virtual IQueryable<Customer> Get(ODataQueryOptions<Customer> q)
    {
        // I return IQueryable from DBSet here...
        return db.GetDbSet<Customer>();
    }
}

Customer不需要地址。如果我像/customers?$expand=Address那样查询它,则不会将Customers包含在Address == null中。它只会返回Customer存在Customer.Address的实体。

我猜它会进行内连接,因此不会获得没有Customer的{​​{1}}实体。 有没有办法包含地址为空的客户?

当前输出:

Address

通缉输出:

[
    {
        Id: 1,
        Name: 'Customer1',
        AddressId: 1,
        Address : 
        {
            Id: 1,
            Street: 'Some street'
        }
    }
]

以上模型就是一个例子。我实际上得到了更大的模型,但我尽量保持示例尽可能短,以提供mcve。我已阅读thisthis问题,但我没有收到任何错误。我根本没有获得实体。

1 个答案:

答案 0 :(得分:0)

使用$expand时,想要的输出似乎是OData服务的正常行为。错误是由我的映射引起的。

出于某种原因,我有一些旧代码需要Address,即使外键本身可以为空。

public class CustomerMap : EntityTypeConfiguration<Customer>
{
    public CustomerMap()
    {
        // Other code...

        // This is wrong!
        this.HasReguired(c => c.Address).WithMany(a => a.Customers);


        // This is right!
        this.HasOptional(c => c.Address).WithMany(a => a.Customers); 
    }
}

由于映射,EF将SQL转换为INNER JOIN而不是OUTER JOIN