2

Windows Azure Mobile Services クエリを実行しようとしています (SDK の xamarins monotouch フォークを使用)。

このコードは、シミュレーターでは問題なく動作しますが、デバイスでは爆発します。

this.table.Where (a => a.Sequence == sequence).Where (a => a.Week == week).ToListAsync()
                .ContinueWith (t =>
            {
                this.items = t.Result;
                this.tableView.ReloadData ();
                IsUpdating = false;
            }, scheduler);

私が得るエラーは次のとおりです。

呼び出しのターゲットによって例外がスローされました。---> System.Exception: --aot-only で実行中にメソッド 'System.Linq.jvm.Runner:GetDelegate ()' を JIT コンパイルしようとしています。

それを機能させるために私がなんとかした唯一のことは、where条件を削除することです。これは、(明らかに)必要に応じて結果をフィルタリングしないことを除いて、うまく機能します。

実際の iOS デバイスで動作するようにコードを書き直すにはどうすればよいですか?

更新: table はタイプ * IMobileServiceTable < Activity > *のクラス変数です

week と sequence はどちらもint型です。

アクティビティは POCO クラスです。

    public class Activity
{
        public int ID {
            get;
            set;
        }
        public string Name {
            get;
            set;
        }

        public int CaloricRequirementMin {
            get;
            set;
        }

        public int CaloricRequirementMax {
            get;
            set;
        }

        public string Difficulty {
            get;
            set;
        }

        public int PlanId {get;set;}

        public string Type {
            get;
            set;
        }

        public int Sequence {
            get;
            set;
        }
        public int Week {
            get;
            set;
        }

        public int SubscriptionActivityId {
            get;
            set;
        }
}

これらが両方とも入力されていることを確認するために再確認しました。

それはシミュレーターで完璧に言います。

4

2 に答える 2

1

最後に、linq 式の代わりに文字列クエリで ReadAsync を使用するようにコードを変更する必要がありました。

this.table.ReadAsync(query)
                .ContinueWith (t =>
            {
                    items = (from item in t.Result.GetArray()
                             let act = item.GetObject()
                    select new Activity{
                        ID= Convert.ToInt32(act.GetNamedNumber("id")),
                        Name= act.GetNamedString("Name"),
                        SubscriptionActivityId = act.ContainsKey("SubscriptionActivityId") ? Convert.ToInt32(act.GetNamedNumber("SubscriptionActivityId")) : 0
                    }).ToList();


                    this.tableView.ReloadData ();
                IsUpdating = false;
            }, scheduler);
于 2013-01-15T21:40:49.990 に答える
1

MonoTouch Ahead Of Time (AOT) コンパイラの要点は、Apple が iOS でのコンパイルを許可していないという問題を回避することです。これは、署名付き実行可能ファイル、アプリ レビュー、サンドボックスなどと同様に、複数のセキュリティ ポリシーの 1 つです。残念ながら、特定の LINQ 式は JIT コンパイルが必要なため、デバイス上で実行できません。

すべての LINQ 式は、LINQ 以外の、通常は反復的なコードに変換できます。反復に変換する前に、Any() 式など、動作する可能性のある LINQ の代替手段を検討できます。

于 2013-01-15T00:47:24.583 に答える