2016-07-13 12 views
0

Entity Frameworkの使用私はDbContextを作成しました。 Dbcontextは、WebApiプロジェクト内で作成されます。 DbContextのテーブルの1つは建物を表します。場所は、データベース内のGeographyタイプとして表されます。私は建物を照会し、結果を所与の場所までの距離でソートする必要があります。複雑な型のWebApi ODataクエリはネストされた値を無視します

クエリに使用されるタイプは、このタイプのModelBuilderの

ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 
// ... Registration of the types generated by EF 
builder.EntitySet<t_building>("t_building"); 
builder.EntitySet<BuildingDistance>("BuildingDistances"); 

に登録されている

[DataContract] 
public class BuildingDistance 
{ 
    [Key] 
    [DataMember] 
    public string Id { get; set; } 
    [DataMember] 
    public string Street { get; set; } 
    [DataMember] 
    public double? Distance { get; set; } 
    [DataMember] 
    public t_building Building { get; set; } 
} 

である私は、次のコントローラのアクションは、クエリが実行され

 public IHttpActionResult GetBuildingDistances(ODataQueryOptions<BuildingDistance> queryOptions) 
    { 
     // validate the query. 
     try 
     { 
      queryOptions.Validate(_validationSettings); 
     } 
     catch (ODataException ex) 
     { 
      return BadRequest(ex.Message); 
     } 

     dbcontext db = new dataBaseEntities(); 
     string pointString = string.Format(CultureInfo.InvariantCulture.NumberFormat, "POINT({0} {1})", 11.53128, 48.17883); 
     DbGeography myLocation = DbGeography.FromText(pointString, 4326); 
     var query = 
      db.t_building.Select(
       x => 
        new BuildingDistance 
        { 
         Id = x.id, 
         Street = x.location_street, 
         Building = x, 
         Distance = x.GeoLocation.Distance(myLocation) 
        }); 

     var result = queryOptions.ApplyTo(query) as IQueryable<BuildingDistance>; 

     return Ok(result); 
    } 

を定義したと結果がクライアントに送信されます。問題は、プロパティビル

{ "odata.metadata":"http://localhost:50732/odata/$metadata#BuildingDistances","value":[ 
{ 
    "Id":"15FF94FE-3CB8-4CF6-BE89-501A8366ED7C","Strasse":"Maistr.","Distance":4407.0418114105069 
} ] 

}

プロパティのみのID、距離やストリートが実際に装着されている存在しないということです。プロパティBuildingは除外されています。

LinqPadでこのクエリを実行すると、プロパティBuildingが設定されます。

プロパティは読み取り専用ではないため、hereの場合は除外されます。

ありがとうございました!

更新:「ObjectContent`1」タイプが コンテンツタイプ「アプリケーション/ JSONの応答体をシリアル化に失敗した

をファン欧陽が推奨するアプローチを試してみましたが、私は次のエラーを取得します。 charset = utf-8 'となります。

更新:OData属性ForeignKeyを使用したナビゲーションプロパティアプローチを使用して試行しました。運がない、$がある場合とない場合。

答えて

0

あなたはペイロードにナビゲーションプロパティを持つようにクエリで

$expand=Building 

を持つ必要があります。

$拡張または$クエリで選択がある場合、あなたがas IQueryable<BuildingDistance>を削除し、https://github.com/OData/WebApi/blob/master/OData/test/E2ETest/WebStack.QA.Test.OData/DollarLevels/DollarLevelsController.cs#L62-L63

かのようなコードを使用する必要がありますので、applytoメソッドの結果の型は、WebAPIの/ ODataの中でラッパークラスになりますコントローラメソッドでEnableQuery Attributeを使用してクエリを返すだけでよい:

[EnableQuery] 
public IHttpActionResult GetBuildingDistances() 
{ 
    ... 
    var query = 
     db.t_building.Select(
      x => 
       new BuildingDistance 
       { 
        Id = x.id, 
        Street = x.location_street, 
        Building = x, 
        Distance = x.GeoLocation.Distance(myLocation) 
       }); 
    return Ok(query as IQueryable<BuildingDistance); 
} 
+0

コメントありがとう!提案がうまくいかず、私はOPへのアップデートでエラーメッセージを投稿しました。 – Nasser

+0

私の答えは –

+0

更新されました。これで、expandとselectを使用できるようになりました。私は2番目の解決策([EnableQuery]キャスト付き)に行きました。ファンOuyangありがとう! – Nasser

関連する問題