Silverlight RIA DomainService,表中有200万行

时间:2011-08-23 13:20:01

标签: c# silverlight wcf ria domainservices

我正在做一个从oracle数据库读取的项目。我使用了Silverlight RIA,并自动生成了DomainService,因为我不太关心结构,因为我只担心显示数据。

我的问题是,当我使用XAML中的domaindatasource,并使用fiddler来调试WCF服务及其调用时,useraccounts表中的第一组数据包含200万行,DomainService超时。

现在我已经尝试将服务的超时时间增加到20分钟,但仍无效,我收到错误:

查询“GETUA_USERACCOUNTS”的加载操作失败。 http请求已超过分配的超时

在我使用的总共9个表中,3个表有大约200万行,这是解决此问题的最佳方法吗?

4 个答案:

答案 0 :(得分:1)

使用ToTraceString方法......

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

...或Oracle分析工具,用于确定正在使用的SQL语句,并确认执行需要很长时间。

使用查询优化技术,例如添加索引来加快速度。

或者,编写一个以更有效的方式返回所需结果的存储过程。

答案 1 :(得分:0)

您应该使用DataPager,请参阅此处: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>

答案 2 :(得分:0)

继续TomTom停止的地方,Red问,在返回结果(Psuedocode)之前,在服务器上进行数据过滤/处理

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);
}

您的消费者只会收到一个数据行。基本形式如下:

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

考虑一下:服务器总是会比你的客户端机器强大得多。让它完成过滤/排序/预处理结果的所有工作,并将其交给最少的数据。你会发现你的RIA实现变得更加活泼。

答案 3 :(得分:0)

我有类似的问题并处理这个我在我的数据库上创建存储过程来完成工作,只吐出我需要的信息。关于向RIA添加存储过程的信息不多,但这里有一个关于我所知道的工作的镜头。

  1. 创建存储过程
  2. 更新项目中的数据库模型以包含存储过程
  3. 右键单击模型浏览器中的
  4. 并添加功能导入。在这里,您可以命名并决定数据的返回方式(让自己轻松一点,并尝试返回DomainService.metadata.cs文件中已有的对象)
  5. 如果创建新的返回对象,请将其添加到您的DomainService.metadata.cs文件
  6. 域服务中的
  7. 添加一个返回结果列表的公共方法。

    public IQueryable<FWCUser> UpdateFWCUserWithUserProfileID(int userProfileID, int fwcUserID)
    {
       return this.ObjectContext.UpdateFWCUserWithUserProfileID(userProfileID, fwcUserID).AsQueryable();
    }
    
  8. 构建项目并根据需要从

    后面的代码调用方法
    FWCDomainContext context = new FWCDomainContext();
    context.Load(context.UpdateFWCUserWithUserProfileIDQuery(num1, num2), Completed, null);