我不能让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现在本机支持地理空间。您是否研究过这一点: