2011-08-23 1 views
1

Я делаю проект, который читается из базы данных оракула. Я использовал Silverlight RIA и автогенерированный DomainService, так как я не слишком беспокоюсь о структурировании, поскольку беспокоюсь только о том, как отображать данные.Silverlight RIA DomainService с 2 миллионами строк в таблице

Вопрос в том, что когда я использую domaindatasource из XAML и использую скрипт для отладки службы WCF и ее вызовов, первый набор данных из таблицы useraccounts содержит 2 миллиона строк, а время ожидания DomainService ,

Теперь я попытался увеличить время ожидания службы до 20 минут, но до сих пор не дало никаких результатов, я получаю ошибку:

операция не удалось загрузить для запроса «GETUA_USERACCOUNTS». HTTP-запрос превысил вычисленный тайм-аут

Кроме того, из 9 таблиц, которые я использую, 3 таблицы имеют около 2 миллионов строк, что было бы лучшим методом для решения этой проблемы?

+0

приложение клиент никогда не должны все 2 миллиона записей. Вы добавили пейджинг/фильтрацию к отображению данных? –

+0

Привет, спасибо за это, я забыл упомянуть, что мне не нужно отображать все данные, мне нужно найти текущую запись на стороне клиента. Пользователь вводит идентификатор пользователя, а затем я извлекаю всю информацию об этом пользователе из разных таблиц, а 3 таблицы имеют 2 миллиона строк, поэтому это вызывает таймауты. – Red

+0

Это очень много данных для отправки в клиентское приложение Silverlight, если вы собираетесь немедленно его фильтровать. Это похоже на то, что вы хотите сделать на стороне сервера, даже если для этого требуется несколько запросов между Silverlight и конечной точкой службы. – avanek

ответ

0

Чтобы продолжить, где TomTom остановились, и спросил Красный, делать фильтрации/обработки данных на сервере, перед возвращением результатов (Psuedocode)

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

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

и ваш comsumer:

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 
} 

Рассмотрим: Неизменно Sever будет много beefier, чем клиентская машина. Пусть он выполняет всю работу по фильтрации/сортировке/препроцессинга, а также передает им минимальные данные. Вы обнаружите, что ваши реализации RIA становятся намного более быстрыми.

+0

Спасибо за помощь, я попробую, как вы предложили. Cheers – Red

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> 
+0

Спасибо за ответ, я фактически не показываю все данные, мне нужно найти текущую запись из фактического списка всех 2 миллионов записей в таблице. Как я продолжу это? – Red

+0

Вы должны добавить FilterDescriptor в DomainDataSource. См. Пример реализации здесь: http://msdn.microsoft.com/en-us/library/system.windows.controls.domaindatasource.filterdescriptors%28VS.91%29.aspx – DenisPostu

+0

Еще раз спасибо DenisPostu, но я думаю, что должен был быть более ясно с вопросом. вот ситуация, с которой я столкнулся. Я забыл упомянуть, что мне не нужно отображать все данные, мне нужно найти текущую запись на стороне клиента. Пользователь вводит идентификатор пользователя, а затем я извлекаю всю информацию об этом пользователе из разных таблиц, а 3 таблицы имеют 2 миллиона строк, поэтому это вызывает тайм-ауты. – Red

1

Используйте метод ToTraceString ...

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

... или профилирующий инструмент Oracle для определения оператора SQL который используется и подтверждает, что для выполнения требуется много времени.

Используйте методы оптимизации запросов, такие как добавление индексов для его ускорения.

В качестве альтернативы напишите хранимую процедуру, которая возвращает требуемый результат более эффективным образом.

+0

Спасибо за помощь Скотт, я попробую, как вы предложили, и вернемся к вам, как все будет в порядке , – Red

0

У меня была аналогичная проблема, и я обрабатывал это, я создал хранимые процедуры в своей базе данных, чтобы выполнить работу и только вертел необходимую мне информацию. В RIA не так много информации о добавлении хранимых процедур, но вот кадр из того, что я знаю.

  1. создать хранимая процедура
  2. обновления базы данных модели в проекте включить хранимую процедуру
  3. в браузере модели щелкните правой кнопкой мыши и добавить импорт функции. здесь вы можете назвать и решить, как данные возвращаются (упростите себя и попытайтесь вернуть объект уже в вашем DomainService.metadata.cs file)
  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); 
    
+0

Thannks за помощь, очень ценится. ура – Red

 Смежные вопросы

  • Нет связанных вопросов^_^