繁体   English   中英

Silverlight RIA DomainService在表中具有200万行

[英]Silverlight RIA DomainService with 2 million rows in a table

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

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

现在,我尝试将服务的超时时间增加到20分钟,但仍然无济于事,我收到了错误消息:

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

另外,在我使用的9张表中,有3张表大约有200万行,什么是解决此问题的最佳方法?

使用ToTraceString方法...

http://msdn.microsoft.com/zh-CN/library/system.data.objects.objectquery.totracestring.aspx

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

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

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

您应该使用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>

要继续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);
}

这样,您的使用者将只收到一个数据行。 基本形式如下:

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

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

我遇到了类似的问题,为了解决这个问题,我在数据库上创建了存储过程来完成工作,并且只吐回我需要的信息。 关于将存储过程添加到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); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM