我不能让Linq比较地理距离?

我不能让Linq比较地理距离?,linq,azure-mobile-services,Linq,Azure Mobile Services,我得到了一个错误: 'new GeoCoordinate(MyEntity.Lat, MyEntity.Lon).GetDistanceTo(14.4416616666667, 5.71794583333333)' is not supported in a 'Where' Mobile Services query expression. 从以下查询: GeoCoordinate mypos = new GeoCoordinate(MainPage.myEntity.Lat, MainPag

我得到了一个错误:

'new GeoCoordinate(MyEntity.Lat, MyEntity.Lon).GetDistanceTo(14.4416616666667, 5.71794583333333)' is not supported in a 'Where' Mobile Services query expression.
从以下查询:

GeoCoordinate mypos = new GeoCoordinate(MainPage.myEntity.Lat, MainPage.myEntity.Lon);

var items = await App.MobileService
                        .GetTable<MyEntity>()
                        .Where(MyEntity => MyEntity.Id != MainPage.myEntity.Id && MyEntity.IsSelected == MainPage.myEntity.IsSelected 
                            && (MyEntity.Lat != 0 && MyEntity.Lon != 0) 
                            && new GeoCoordinate(MyEntity.Lat, MyEntity.Lon).GetDistanceTo(mypos) <= 5000)
                        .Take(20)
                        .ToListAsync();
geocordination mypos=新的地理坐标(MainPage.myEntity.Lat,MainPage.myEntity.Lon);
var items=wait App.MobileService
.GetTable()
.Where(MyEntity=>MyEntity.Id!=MainPage.MyEntity.Id&&MyEntity.IsSelected==MainPage.MyEntity.IsSelected
&&(MyEntity.Lat!=0&&MyEntity.Lon!=0)

&&新的地理坐标(MyEntity.Lat,MyEntity.Lon).GetDistanceTo(mypos)您需要注意的一点是,行表达式不是在本地执行的。它被转换为一个查询字符串,然后发送到服务器-否则您将下载比需要多得多的数据(顺便说一句,您仍然可以这样做).鉴于此,无法将方法
GeoCoordination.GetDistanceTo
转换为可以通过电线发送的内容

服务器中支持一些操作,例如算术(+、-、*、/),您可以实现类似于所需的操作。下面的代码应该可以运行(尚未尝试)。请注意,您需要在坐标(lat/lon)中的距离之间进行转换以及
GetDistanceTo
方法返回的任何单位

GeoCoordinate mypos = new GeoCoordinate(MainPage.myEntity.Lat, MainPage.myEntity.Lon);
double maxDistance = 1;
var items = await App.MobileService
    .GetTable<MyEntity>()
    .Where(e => e.Id != MainPage.myEntity.Id &&
                e.IsSelected == MainPage.myEntity.IsSelected &&
                (e.Lat != 0 && e.Lon != 0) &&
                ( ((e.Lat - mypos.Lat) * (e.Lat - mypos.Lat) +
                   (e.Lon - mypos.Lon) * (e.Lon - mypos.Lon)) < maxDistance )
    .Take(20)
    .ToListAsync();
geocordination mypos=新的地理坐标(MainPage.myEntity.Lat,MainPage.myEntity.Lon);
双最大距离=1;
var items=wait App.MobileService
.GetTable()
.Where(e=>e.Id!=MainPage.myEntity.Id&&
e、 IsSelected==MainPage.myEntity.IsSelected&&
(e.Lat!=0和e.Lon!=0)&&
((e.Lat-mypos.Lat)*(e.Lat-mypos.Lat)+
(e.Lon-mypos.Lon)*(e.Lon-mypos.Lon))
或者,正如我前面提到的,另一种选择是不按通话距离过滤,然后再过滤。类似于下面的代码:

GeoCoordinate mypos = new GeoCoordinate(MainPage.myEntity.Lat, MainPage.myEntity.Lon);
List<MyEntity> items = new List<MyEntity>();
int skip = 0;
while (items.Count < 20) {
    var temp = await App.MobileService
        .GetTable<MyEntity>()
        .Where(e => e.Id != MainPage.myEntity.Id &&
                    e.IsSelected == MainPage.myEntity.IsSelected &&
                    (e.Lat != 0 && e.Lon != 0)
        .Skip(skip)
        .Take(20)
        .ToListAsync();
    if (temp.Count == 0) break;
    foreach (var item in temp)
    {
        if (new GeoCoordinate(item.Lat, item.Lon).GetDistanceTo(mypos) <= 5000)
        {
            items.Add(item);
        }
    }
}
geocordination mypos=新的地理坐标(MainPage.myEntity.Lat,MainPage.myEntity.Lon);
列表项=新列表();
int skip=0;
而(项目数<20){
var temp=wait App.MobileService
.GetTable()
.Where(e=>e.Id!=MainPage.myEntity.Id&&
e、 IsSelected==MainPage.myEntity.IsSelected&&
(e.Lat!=0和e.Lon!=0)
.Skip(Skip)
.Take(20)
.ToListAsync();
如果(温度计数==0)中断;
foreach(临时中的变量项)
{

如果(new GeoCoordination)(item.Lat,item.Lon).GetDistanceTo(mypos),您的Linq提供商无法告诉您的DB什么是大地距离。大地距离一词是虚构的。请看我Where语句的最后一行,我试图通过地理坐标中的距离函数进行限制。好的,但我认为,基于“在“Where”移动服务查询表达式中不受支持。”,您的
SQL Asure
GeoCoordination类一无所知。这也是我的想法,因此如何按纬度和经度限制列表?Azure SQL现在本机支持地理空间。您是否研究过这一点: