1

エラーが発生します:

'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();

私ではなく、私の位置から 5 km 以内にあるテーブルから 20 個のエンティティを取得しようとしています。

4

1 に答える 1

3

注意しなければならないことの 1 つは、行式がローカルで実行されないことです。代わりに、サーバーに送信されるクエリ文字列に変換されます。そうしないと、必要以上に多くのデータをダウンロードすることになります (ちなみに、これはまだ可能です)。GeoCoordinate.GetDistanceToそのため、メソッドをネットワーク経由で送信できるものに変換する方法はありません。

算術演算 (+、-、​​、/) など、サーバーでサポートされている操作がいくつかあり、必要なものと同様のものを実装できる可能性があります。以下のコードのようなものが動作するはずです (まだ試していません)。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();

または、前に述べたように、その通話の距離でフィルタリングせず、後でフィルタリングするという別の方法もあります。以下のコードのようなもの:

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);
        }
    }
}
于 2013-01-17T06:22:38.757 に答える