【发布时间】:2016-11-15 21:06:47
【问题描述】:
我使用实体框架创建了一个 DbContext。 Dbcontext 在 WebApi 项目中创建。 DbContext 中的一张表代表建筑物。该位置在数据库中表示为地理类型。我需要查询建筑物并按到给定位置的距离对结果进行排序。
用于查询的类型是
[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; }
}
此类型已在模型构建器中注册
ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
// ... Registration of the types generated by EF
builder.EntitySet<t_building>("t_building");
builder.EntitySet<BuildingDistance>("BuildingDistances");
我定义了以下控制器操作
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);
}
执行查询并将结果发送给客户端。问题是属性 Building 不存在
{ "odata.metadata":"http://localhost:50732/odata/$metadata#BuildingDistances","value":[
{
"Id":"15FF94FE-3CB8-4CF6-BE89-501A8366ED7C","Strasse":"Maistr.","Distance":4407.0418114105069
} ]
}
实际上只填充了属性 ID、距离和街道。物业大楼被排除在外。
如果我在 LinqPad 中运行此查询,则会填充属性 Building。
属性不是只读的,因此排除了here 的情况。
感谢您的任何建议!
更新:尝试了范欧阳推荐的方法,我得到以下错误
“ObjectContent`1”类型未能序列化响应正文 内容类型'应用程序/json; charset=utf-8'。
更新:尝试使用 OData 的导航属性方法使用 Attribute ForeignKey。运气不好,有和没有 $expand。
【问题讨论】:
标签: entity-framework asp.net-web-api odata