2011-01-24 14 views
1

は、私は空を返す次のクエリは(列挙は何の結果が得られていない)していますSL WCFサービス:のSilverlight RIAクエリは

var qry = _ctx.GetStudentByIDQuery(studentId); 
var load = _ctx.Load(qry); 
load.Completed += (s, e) => 
{ 
    CurrentStudent = _ctx.Students.FirstOrDefault(); 
    dataForm1.CurrentItem = CurrentStudent; 
    BeginEdit(); 
}; 

なぜ最初の方法は機能しませんか?サーバー側のクエリは、IDと同じフィルタリングを最初のクエリと同じように実行するため、クエリ自体ではありません。私が見たRIAの使用例のどれもCompletedイベントハンドラを使用していません。 RIAはシーンの背後にある非同期ロードを処理することになっています。何がありますか?

編集 私は少し質問に再集中したいと思っていました。ここであなたが期待するのと同じように動作し、私が持っている別のクエリです:

var query = ctx.GetStudentsWithAdultContactsQuery(); 
studentDataGrid.ItemsSource = ctx.Students; 
ctx.Load(query); 

私はここで明示的に完了したコールバックを処理していないのですが、それは私がRIAはhereを含め、ウェブ上の例で使用される参照方法です。したがって、このクエリと、動作しないクエリとの明白な違いは、(a)フィルタリングと(b)データバインディングターゲットです。しかし、なぜ違いを生むべきですか?

+0

私はおそらくLinqToSqlDomainServiceを使用していることを言及する必要があります – Antony

+0

サービス側でこれを行う必要があると言いますか? – VoodooChild

+0

いいえ、コードは両方の例でクライアント上にあります。 2番目の例では、フィルタリング(SingleOrDefault(s => ...)がサーバ上にありますが、それはおそらく問題を混乱させます)。なぜなら、RIAが非同期コールバックを処理していると思ったからです。 – Antony

答えて

0

ために、このリンクをご覧ください。

二つの状況 - グリッドを結合して、データフォームを結合 - 私はので、以前のシナリオで異なっていますEntitySet(学生)にバインドしていますが、私は個々のエンティティ(学生)にバインドしています。名前:まあ、そう!しかし何?

そこで、EntitySetグリッドが更新させる、エンティティが(クエリが結果を返す場合など)セットに追加される通知イベントを発生させINotifyCollectionChangedを実装します。一方、データフォームCurrentItemEntitySetにバインドされていないため、Studentsコレクションの変更をリッスンしておらず、CurrentStudentがnullではないこともわかりません。

var qry = _ctx.GetStudentsWithAdultContactsQuery().Where(s => s.StudentID == studentId); 
_ctx.Load(qry); 
_ctx.Students.EntityAdded += new EventHandler<EntityCollectionChangedEventArgs<Student>>(Students_EntityAdded); 
//... 
void Students_EntityAdded(object sender, EntityCollectionChangedEventArgs<Student> e) 
{ 
    dataForm1.CurrentItem = e.Entity; 
} 

それとも、もっと簡潔に:したがって、私はロードが完了するまで、または私はグリッドはおそらくない何かを行うことができ、同様の効果に働く学生のコレクション、を聞くのを待つ必要はあり

var qry = _ctx.GetStudentsWithAdultContactsQuery(); 
_ctx.Load(qry.Where(s => s.StudentID == studentId)); 
_ctx.Students.EntityAdded += (s, e) => { 
    dataForm1.CurrentItem = e.Entity; 
}; 

私はこの質問に答えているとマークしていますが、あなたの説明を私と違うものにすることを歓迎しています。それが新しい洞察を提供するならば、私は喜んでそれを投票するでしょう。

1
+0

この非同期モデルをできるだけ負担しないようにする1つの方法は、できる限りデータバインディングに頼ることです。RIA Servicesは、コレクションとエンティティを非常に拘束します。つまり、親しみやすいので、ほとんどの場合、非同期のクラップを無視することができます。 –

+0

@Austin、良い例を教えていただけますか?私はCurrentItem = "{CurrentStudent}"をデータフォームに追加し、最初のメソッドを使用して再試行しましたが、何も得られませんでした。 – Antony

+0

@Antony - 私はあなたの例を完全に理解していません。なぜ "FirstOrDefault"の学生はいつもあなたが望むものですか?生徒IDと生徒IDを必ず選択してください。 RIA Servicesのクライアント側Studentsコレクションは、すべてのLoadオペレーションでエンティティを累積します。したがって、最初のロード後、この「FirstOrDefault」アプローチは間違った学生を獲得する可能性があります。 –

関連する問題