在Web API 2項目中,我試圖獲取屬於單個項目的所有座標(可以是1到1000之間的任意值)並計算中心點。 計算中心點的函數按預期工作。返回錯誤的類型 - cast?
但是下面的控制器失敗,錯誤: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);
}
你的錯誤是因爲該行的:'。選擇(fetchedItem => GetCentralGeoCoordinate(fetchedItem.Coordinates));'在結束您嘗試使用「選擇」方法選擇「GeoCoordinate」 –