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を使用したナビゲーションプロパティアプローチを使用して試行しました。運がない、$がある場合とない場合。
コメントありがとう!提案がうまくいかず、私はOPへのアップデートでエラーメッセージを投稿しました。 – Nasser
私の答えは –
更新されました。これで、expandとselectを使用できるようになりました。私は2番目の解決策([EnableQuery]キャスト付き)に行きました。ファンOuyangありがとう! – Nasser