Silverlight RIA DomainService с 2 миллионами строк в таблице - PullRequest
1 голос
/ 23 августа 2011

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

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

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

Операция загрузки не выполнена для запроса "GETUA_USERACCOUNTS".HTTP-запрос превысил выделенное время ожидания

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

Ответы [ 4 ]

1 голос
/ 23 августа 2011

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

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

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

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

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

0 голосов
/ 25 августа 2011

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

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

Чтобы продолжить с того места, где остановился 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 стали намного более быстрыми.

0 голосов
/ 23 августа 2011

Вы должны использовать 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>
...