2016-09-27 1 views
1

У меня есть служебная сборка OData с WebAPI и EF 6. Я использую свободно 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, у которых нет Address. Есть ли способ включить клиентов, где адрес также нулевой?

Выходной ток:

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

Wanted выход:

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

Модели выше пример. У меня на самом деле появились более крупные модели, но я попытался как можно короче привести пример, чтобы обеспечить mcve. Я прочитал this и this вопрос, но я не получаю никаких ошибок. Я просто не получаю сущности вообще.

+0

Что такое ваш запрос EF? – Sampath

+0

Я просто возвращаю свой 'DbSet' как запрос, поэтому я вообще не делаю запрос. Я добавил код к примеру. – smoksnes

ответ

0

Похоже, что желаемый выход является нормальным поведением для службы OData при использовании $expand. Ошибка была вызвана моими сопоставлениями.

По какой-то причине у меня был небольшой код, который сделал 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.

 Смежные вопросы

  • Нет связанных вопросов^_^