2016-09-27 2 views
1

WebAPIとEFで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.Addressが存在するCustomerエンティティのみが返されます。

私は内部結合を行い、Addressを持たないCustomerエンティティを取得しないと思います。 アドレスがヌルの場合でも顧客を含める方法はありますか?

電流出力:

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

募集出力は:

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

モデル上の例です。私は実際にはもっと大きなモデルを手に入れましたが、私はmcveを提供するために可能な限り短い例を保つように努めました。私はthisthisの質問を読んだことがありますが、何のエラーもありません。私は実体を全く得ていない。

+0

あなたのEFクエリは何ですか? – Sampath

+0

私は 'DbSet'を問い合わせ可能なものとして返すので、私は全く問い合わせをしません。この例にコードを追加しました。 – smoksnes

答えて

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はINNER JOIN代わりのOUTER JOINにSQLを翻訳。

関連する問題