在Web API 2项目中,我试图获取属于单个项目的所有坐标(可以是1到1000之间的任何位置)并计算中心点。 计算中心点的功能按预期工作。
但是以下控制器失败,错误为:Cannot implicitly convert SYstem.Linq.IQueryable<System.Device.Location.GeoCoordinates> to System.Linq.IQueryable<ItemDTO>
。在return items.AsQueryable();
如何让它作为ItemDTO
返回?
模型
public class Item
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<Location> Locations { get; set; }
}
public class ItemDTO
{
public int Id { get; set; }
public string Title { get; set; }
public IEnumerable<GeoCoordinate> Coordinates { get; set; }
}
public class Location
{
public int Id { get; set; }
public string cX { get; set; }
public string cY { get; set; }
public virtual Item Item { get; set; }
}
控制器
public IQueryable<ItemDTO> GetList()
{
var sourceItems = db.Items.Include(x => x.Locations).ToList();
var items = sourceItems.Select(item => new ItemDTO()
{
Id = item.Id,
Title = item.Title
Coordinates = item.Locations
.Select(itemLocation => new GeoCoordinate()
{
Latitude = Double.Parse(itemLocation.cX, CultureInfo.InvariantCulture),
Longitude = Double.Parse(itemLocation.cY, CultureInfo.InvariantCulture)
})
})
.AsEnumerable()
.Select(fetchedItem => GetCentralGeoCoordinate(fetchedItem.Coordinates));
return items.AsQueryable();
}
方法
public static GeoCoordinate GetCentralGeoCoordinate(IEnumerable<GeoCoordinate> geoCoordinates)
{
if (geoCoordinates.Count() == 1)
{
return geoCoordinates.Single();
}
double x = 0;
double y = 0;
double z = 0;
foreach (var geoCoordinate in geoCoordinates)
{
var latitude = geoCoordinate.Latitude * Math.PI / 180;
var longitude = geoCoordinate.Longitude * Math.PI / 180;
x += Math.Cos(latitude) * Math.Cos(longitude);
y += Math.Cos(latitude) * Math.Sin(longitude);
z += Math.Sin(latitude);
}
var total = geoCoordinates.Count();
x = x / total;
y = y / total;
z = z / total;
var centralLongitude = Math.Atan2(y, x);
var centralSquareRoot = Math.Sqrt(x * x + y * y);
var centralLatitude = Math.Atan2(z, centralSquareRoot);
return new GeoCoordinate(centralLatitude * 180 / Math.PI, centralLongitude * 180 / Math.PI);
}
答案 0 :(得分:0)
根据签名,方法IQueryable<ItemDTO> GetList()
应返回IQueryable<ItemDTO>
类型的值,方法GetCentralGeoCoordinate
应返回类型GeoCoordinate
的值。
现在看一下GetList()
方法,其中:查询选择
.Select(fetchedItem => GetCentralGeoCoordinate(fetchedItem.Coordinates));
表示所选代码中的每个项目都是GeoCoordinate
类型,因此items.AsQueryable()
会为您提供IQueryable<GeoCoordinate>
。它不等同于或可转换为IQueryable<ItemDTO>
而导致问题。
您必须将
GetList
的签名更改为IQueryable<GeoCoordinate>
或需要创建一个方法来获取 来自IQueryable<ItemDTO>
的{{1}}来解决问题。
您可以尝试使用以下代码:
fetchedItem