2012-03-08 17 views

答えて

7

、ここではトリックです:)

私はADO.NET Entity Frameworkのモデルを露出させ、私のWCFサービスに「サービス参照」を追加しました。問題は、XAML/C#のMetroアプリでは、次のコードを実行すると失敗するということです。

SampleEntities ctx = ((App)Application.Current).Context; 
var query = from p in ctx.Products 
       where p.Name == name 
       select p; 

foreach (Product p in query) /** this line fails **/ 
{ 
    // do stuff 
} 

ここでは、実行時に取得します例外です:

「Silverlightは、直接列挙することはできません。 サービスクエリの列挙型では、 同期要求がデータサービスに自動的に送信されるため、Silverlightのみが非同期操作をサポートするため、 BeginExecuteメソッドとEndExecuteメソッドを呼び出して、というクエリ結果を取得する必要があります。 0}列挙型をサポートしています。 "} [System.NotSupportedException]:{" Silverlightでは、データサービスクエリで直接列挙することはできません。これは、 列挙によって自動的に同期要求がデータ サービスに送信されるためです。 Silverlightは唯一の非同期操作をサポートしているので、 あなたの代わりに列挙をサポートしているクエリ結果を得る にBeginExecuteとEndExecuteメソッドを呼び出す必要があります。」

をああ、これが本当であるには余りにも良いだったでしょう!

例外で述べたように、あなたのサーバがちょうどSilverlightのように、非同期に呼び出す必要がある

ここであなたはそれを古い学校道をやっC#のメトロアプリケーションでWCF RIAサービスを消費することができる方法の例です。:

(...) 
var query = from p in ctx.Products 
      where p.Name == Name 
      select p; 

((DataServiceQuery<Product>)query).BeginExecute(OnLoadItemsCompleted, query); 
(...) 

private void OnLoadItemsCompleted(IAsyncResult result) 
{ 
    var query = result.AsyncState as DataServiceQuery<Product>; 
    IEnumerable<Product> response = query.EndExecute(result); 

    foreach (Product o in response) 
    { 
     // Do stuff 
    } 
} 

今すぐ.NET 4.5を使用して、その新しい & 非同期キーワードを待って、あなたはすべてのそれらのほとんどのコールバックメソッドでチャンクするためにあなたのコードを回避しながら、同じ結果を得ることができます。

例:最後の二つの方法のいずれかを使用して

async void GetProducts() 
{ 
    SampleEntities ctx = ((App)Application.Current).Context; 
    var query = from p in ctx.Products 
        where p.Name == name 
        select p; 
    DataServiceQuery<Product> dqs = (DataServiceQuery<Product>)(query); 
    TaskFactory<IEnumerable<Product>> tf = new TaskFactory<IEnumerable<Product>>(); 
    myListView.ItemsSource = await tf.FromAsync(dqs.BeginExecute(null, null), 
           iar => dqs.EndExecute(iar)); 
} 

が私のためにうまく働いた:)

+0

はそれを愛する - 感謝そんなに、これは私が探していたまさにです – WaterBoy

関連する問題