返回错误的类型 - 演员?

时间:2017-11-11 06:42:15

标签: c# asp.net linq asp.net-web-api

在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);
    }

1 个答案:

答案 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