Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用RIA服务的参数计算属性_C#_Wcf_Silverlight_Entity Framework_Ria - Fatal编程技术网

C# 使用RIA服务的参数计算属性

C# 使用RIA服务的参数计算属性,c#,wcf,silverlight,entity-framework,ria,C#,Wcf,Silverlight,Entity Framework,Ria,我正在计算地址之间的距离。特别是用户与特定位置之间的距离。我可以构建LINQ查询,使数据库计算距离并按该距离对结果排序。但是,我找不到一种方法来返回实体中的距离。查询的简化版本如下: public IQueryable<Place> GetPlacesWithinRadiusOfUser(double userLongitude, double userLatitude, int miles ) { return (from Place in thi

我正在计算地址之间的距离。特别是用户与特定位置之间的距离。我可以构建LINQ查询,使数据库计算距离并按该距离对结果排序。但是,我找不到一种方法来返回实体中的距离。查询的简化版本如下:

    public IQueryable<Place> GetPlacesWithinRadiusOfUser(double userLongitude, double userLatitude, int miles )
    {

        return (from Place in this.ObjectContext.Places
                where RadiusOfEarth * Math.Acos((double)
                    (Math.Sin((double)Place.Addresses.First().Latitude / DegreesToRadians) * Math.Sin(userLatitude / DegreesToRadians))
                    +
                    (Math.Cos((double)Place.Addresses.First().Latitude / DegreesToRadians) * Math.Cos(userLatitude / DegreesToRadians)
                    * Math.Cos((userLongitude / DegreesToRadians) - ((double)Place.Addresses.First().Longitude / DegreesToRadians))
                    )
                    )
                    <= miles
                select Place);


    }
public IQueryable GetPlacesWithinRadiusOfUser(双用户经度、双用户纬度、整数英里)
{
返回(从this.ObjectContext.Places中的位置)
其中地球半径*Math.Acos((双精度)
(Math.Sin((双)Place.Addresses.First().Latitude/DegreesToRadians)*Math.Sin(userLatitude/DegreesToRadians))
+
(Math.Cos((双)Place.Addresses.First().Latitude/degreestorarians)*Math.Cos(userLatitude/degreestorarians)
*Math.Cos((userLongitude/degreestoradis)-(double)Place.Addresses.First().Longitude/degreestoradis))
)
)

使用Entity Framework,我始终无法找到一种实际执行此操作的方法(我想要的方法)。但是,我找到了一个非常好的解决方案。步骤如下:

  • 通过在ObjectContext上发出距离计算来创建查询…然后根据返回的值筛选位置查询。所有这些都是在客户端的一次查询调用中完成的。它不返回距离…但我以不同的方式处理了它

  • 然后,我在所有relavent对象上创建了扩展方法,如下所示:

    public static class AddressExtensions
    {
    
    
    public static double CalculateDistanceTo(this Address address1, double longitude, double latitude)
    {
        if (address1 == null)
        {
            return 0;
        }
    
        return Global.CalculateDistance((double?)address1.Longitude, (double?)address1.Latitude, longitude, latitude);
    
    }
    
    public static double CalculateDistanceTo(this Address address1, Address address)
    {
        if (address1 == null || address == null)
        {
            return 0;
        }
    
        return Global.CalculateDistance((double?)address1.Longitude, (double?)address1.Latitude, (double?)address.Longitude, (double?)address.Latitude);
    
    }
    
    public static double CalculateDistanceTo(this Address address1, User user)
    {
        if (address1 == null)
        {
            return 0;
        }
    
        return address1.CalculateDistanceTo(user.Addresses.FirstOrDefault());
    
    }
    
    public static double CalculateDistanceTo(this Address address1, Place place)
    {
        if (address1 == null)
        {
            return 0;
        }
    
        return address1.CalculateDistanceTo(place.Addresses.FirstOrDefault());
    
    }
    }
    
  • 然后,我可以在任何需要获得距离的地方执行类似User.DistanceTo(myAddress)的操作


  • 这实际上效果更好,因为无论在什么情况下,我都可以重用相同的扩展方法。

    一个想法:使用计算结果创建DTO,并在数据传输中使用它们。只是好奇:您不能使用sql server空间类型吗?
    public static class AddressExtensions
    {
    
    
    public static double CalculateDistanceTo(this Address address1, double longitude, double latitude)
    {
        if (address1 == null)
        {
            return 0;
        }
    
        return Global.CalculateDistance((double?)address1.Longitude, (double?)address1.Latitude, longitude, latitude);
    
    }
    
    public static double CalculateDistanceTo(this Address address1, Address address)
    {
        if (address1 == null || address == null)
        {
            return 0;
        }
    
        return Global.CalculateDistance((double?)address1.Longitude, (double?)address1.Latitude, (double?)address.Longitude, (double?)address.Latitude);
    
    }
    
    public static double CalculateDistanceTo(this Address address1, User user)
    {
        if (address1 == null)
        {
            return 0;
        }
    
        return address1.CalculateDistanceTo(user.Addresses.FirstOrDefault());
    
    }
    
    public static double CalculateDistanceTo(this Address address1, Place place)
    {
        if (address1 == null)
        {
            return 0;
        }
    
        return address1.CalculateDistanceTo(place.Addresses.FirstOrDefault());
    
    }
    }