1

Oracle データベースから読み取るプロジェクトを行っています。私は Silverlight RIA を使用し、DomainService を自動生成しました。これは、データを表示することだけを考えているため、構造化についてはあまり気にしていないためです。

私の質問は、XAML から domaindatasource を使用し、WCF サービスとその呼び出しをデバッグするためにフィドラーを使用すると、useraccounts のテーブルの最初のデータ セットに 200 万行が含まれ、DomainService がタイムアウトすることです。

サービスのタイムアウトを 20 分に増やしてみましたが、まだ役に立ちません。次のエラーが表示されます。

クエリ "GETUA_USERACCOUNTS" の読み込み操作が失敗しました。への http 要求が割り当てられたタイムアウトを超えました

また、私が使用している合計 9 つのテーブルのうち、3 つのテーブルには約 200 万行ありますが、この問題に取り組むための最良の方法は何でしょうか?

4

4 に答える 4

1

ToTraceString メソッドを使用します...

http://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring.aspx

...または Oracle プロファイリング ツールを使用して、使用されている SQL ステートメントを特定し、実行に時間がかかることを確認します。

インデックスを追加するなどのクエリ最適化手法を使用して高速化します。

または、より効率的な方法で必要な結果を返すストアド プロシージャを記述します。

于 2011-08-23T14:08:21.477 に答える
0

同様の問題があり、これを処理するために、データベースにストアドプロシージャを作成して作業を行い、必要な情報のみを吐き出しました。RIA へのストアド プロシージャの追加に関する情報はあまりありませんが、ここで私が知っている動作のショットを示します。

  1. ストアド プロシージャを作成する
  2. プロジェクトのデータベース モデルを更新して、ストアド プロシージャを含めます。
  3. モデル ブラウザーで右クリックし、関数のインポートを追加します。ここで名前を付けて、データがどのように返されるかを決定します (簡単にして、DomainService.metadata.cs ファイルに既にあるオブジェクトを返すようにしてください)。
  4. 新しい戻りオブジェクトを作成する場合は、それを DomainService.metadata.cs ファイルに追加します
  5. ドメイン サービスに、結果リストを返すパブリック メソッドを追加します。

    public IQueryable<FWCUser> UpdateFWCUserWithUserProfileID(int userProfileID, int fwcUserID)
    {
       return this.ObjectContext.UpdateFWCUserWithUserProfileID(userProfileID, fwcUserID).AsQueryable();
    }
    
  6. プロジェクトをビルドし、必要に応じてコード ビハインドからメソッドを呼び出します

    FWCDomainContext context = new FWCDomainContext();
    context.Load(context.UpdateFWCUserWithUserProfileIDQuery(num1, num2), Completed, null);
    
于 2011-08-25T07:16:57.490 に答える
0

ここを参照してください: http://www.silverlightshow.net/items/Creating-applications-with-.NET-RIA-Services-Part-4-Adding-a-DomainDataSource.aspx

<navigation:Page x:Class="WebAdministrationTool.ManageUsers" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:ria="clr-namespace:System.Windows.Controls;assembly=System.Windows.Ria.Controls"
    xmlns:local="..."
    xmlns:validation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data.DataForm">

    <Grid x:Name="LayoutRoot">

        <data:DataGrid x:Name="UsersGrid" 
                       IsReadOnly="True" 
                       AutoGenerateColumns="True"
                       ItemsSource="{Binding Data, ElementName=MyDataSource}" />

        <validation:DataPager x:Name="UsersPager"
                              PageSize="10" 
                              Source="{Binding Data, ElementName=MyDataSource}" />

        <ria:DomainDataSource x:Name="MyDataSource" LoadMethodName="LoadHugeAmountOfRows">
            <ria:DomainDataSource.DomainContext>
                <local:MyDomainContext />
            </ria:DomainDataSource.DomainContext>
        </ria:DomainDataSource>

    </Grid>

</navigation:Page>
于 2011-08-23T13:25:36.550 に答える
0

TomTom が中断し、Red が要求したところから続行するには、結果を返す前にサーバーでデータのフィルタリング/処理を行います (疑似コード)

public IQueriable<UserDTO> GetUserAccountDetails(string UserID)
{
    DataSet oneBazillionRows = SQLServer.GetAllUserRows();

    // LINQ to the rescue
    return from user in oneBillionRows
           where user.ID = UserID;
}

そしてあなたの消費者:

public void GetUserInfo()
{
    ServiceContext context = new ServiceContext();
    context.Load<UserDTO>(ServiceContext.GetUserAccountDetailsQuery(), load =>
    {
        // do some work here
        //like signalling the call is complete
        // or storing the data in your View Model
    }, null);
}

コンシューマーは、1 つのデータ行のみを受け取ります。基本的なフォームは次のようになります。

public IQueriable<ReturnType> WebService(Parameter parameter, ...)
{
    // Do all your work here, return minimal results
}

考えてみてください: 常に、サーバーはクライアント マシンよりもはるかに強力になります。結果のフィルタリング/ソート/前処理のすべての作業を実行し、最小限のデータを渡すようにします。RIA の実装がより機敏になることがわかるでしょう。

于 2011-08-23T21:56:15.637 に答える