Silverlight RIA DomainService,表中有200万行
本文关键字:200万行 RIA DomainService Silverlight | 更新日期: 2023-09-27 18:06:37
我正在做一个从oracle数据库读取的项目。我使用了Silverlight RIA和自动生成的DomainService,因为我不太关心结构,因为我只担心显示数据。
我的问题是,当我使用来自XAML的domaindatasource,并使用fiddler调试WCF服务及其调用时,来自用户帐户表的第一组数据包含200万行,并且DomainService超时。
现在我已经尝试将服务的超时时间增加到20分钟,但仍然无济于事,我得到错误:
查询"GETUA_USERACCOUNTS"加载操作失败。http请求已超过分配的超时
在我使用的总共9个表中,有3个表有大约200万行,解决这个问题的最佳方法是什么?
使用ToTraceString方法…
http://msdn.microsoft.com/en-us/library/system.data.objects.objectquery.totracestring.aspx…或Oracle分析工具,以确定正在使用的SQL语句,并确认它需要很长时间才能执行。
使用查询优化技术,如添加索引来加快速度。
或者,编写一个存储过程,以更有效的方式返回所需的结果。
在返回结果(Psuedocode)之前,在服务器上进行数据过滤/处理,以继续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实现变得更加快捷。
您应该使用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>
我也有类似的问题,为了处理这个问题,我在数据库上创建了存储过程来完成工作,只返回我需要的信息。没有很多关于添加存储过程到RIA的信息,但这里有一个我所知道的工作原理。
- 创建存储过程
- 更新项目中的数据库模型,以包含存储过程 在模型浏览器中右键单击
- ,添加函数导入。在这里,您可以命名并决定如何返回数据(让您自己轻松,并尝试返回已经在DomainService.metadata.cs文件中的对象)
- 如果创建新的返回对象,将其添加到您的DomainService.metadata.cs文件
在域服务中添加一个返回结果列表的公共方法。
public IQueryable<FWCUser> UpdateFWCUserWithUserProfileID(int userProfileID, int fwcUserID) { return this.ObjectContext.UpdateFWCUserWithUserProfileID(userProfileID, fwcUserID).AsQueryable(); }
构建项目并根据需要从
后面的代码调用该方法FWCDomainContext context = new FWCDomainContext(); context.Load(context.UpdateFWCUserWithUserProfileIDQuery(num1, num2), Completed, null);