LINQ to SQL и Dynamics CRM 2011 представления данных и подкачка страниц ОЧЕНЬ МЕДЛЕННО - PullRequest
1 голос
/ 07 апреля 2011

Я в растерянности, потому что это лучший способ получить доступ к данным Dynamics CRM 2011 и с пользовательскими критериями поиска.Я портирую веб-сайт, который использует базу данных контактов и формирует безопасность.Контакты были перенесены в Dynamics CRM 2011, поэтому я использую CRM 2011 SDK и раннее связывание для подключения к CRM для получения данных.Я использовал инструмент генерации кода, CrmSvcUtil.exe.Я использую LINQ для создания запроса, который выбирает из набора контактов в классе ContactViewDefault:

IQueryable<ContactViewDefault> query = from c in orgContext.ContactSet
                                                select new ContactViewDefault
                                                {
                                                    Username = c.EMailAddress1 ?? "",
                                                    Title = c.Salutation ?? "",
                                                    Firstname = c.FirstName ?? "",
                                                    Lastname = c.LastName ?? "",
                                                    Organisation = "",
                                                    Position = c.JobTitle ?? "",
                                                    Phone = c.Telephone1 ?? "",
                                                    Mobile = c.MobilePhone ?? "",
                                                };

PagedDataSource pagedData = new PagedDataSource();
        pagedData.AllowCustomPaging = true;
        pagedData.AllowPaging = true;
        pagedData.PageSize = 10;
        pagedData.CurrentPageIndex = 1;
        pagedData.DataSource = query;

Если я затем привязываю данные к «Имя пользователя»

<%# DataBinder.Eval(Container.DataItem, "Username")%>

, я получаю ошибку:«ContactViewDefault» не содержит свойство с именем «Имя пользователя».Кроме того, вызов query.Count () не поддерживается.

Затем я попытался с помощью кода CopyToDataTable (см .: http://msdn.microsoft.com/en-us/library/bb669096.aspx) скопировать в таблицу данных, а затем использовать существующие ретрансляторы и пейджинг.Проблема в том, что код очень медленный.Заполнение таблицы данных может занять около 3 минут.В таблице содержится 7000 записей.

Я пробовал настраиваемую подкачку, как описано в http://www.dotnetcurry.com/ShowArticle.aspx?ID=345,

query.OrderBy(c => c.Username);
query.Take(10);
query.Skip(0);

, чтобы выбрать первые 10 записей, но все равно требуется более 20секунд, чтобы заполнить основной повторитель.Для сравнения, исходный код может выделить все данные в источнике данных с постраничной загрузкой и отобразить первую страницу менее чем за секунду.

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

Ответы [ 2 ]

0 голосов
/ 17 марта 2015

Арочный ответ правильный.Вы пытаетесь преобразовать все данные в ContactViewDefault.Если вы хотите, вы можете попробовать использовать этот код

IQueryable<ContactViewDefault> query = (from c in orgContext.ContactSet
                                            select a).AsQuerayable();
var data = (from c in query.Take(10)
            select new ContactViewDefault
                                            {
                                                Username = c.EMailAddress1 ?? "",
                                                Title = c.Salutation ?? "",
                                                Firstname = c.FirstName ?? "",
                                                Lastname = c.LastName ?? "",
                                                Organisation = "",
                                                Position = c.JobTitle ?? "",
                                                Phone = c.Telephone1 ?? "",
                                                Mobile = c.MobilePhone ?? "",
                                            }).ToList();

Убедитесь, что производительность не снизится, если вы попытаетесь использовать этот образец.Я вполне согласен, что Linq для SQL в CRM недостаточно хорош.Но это основное, конечно, очень важно знать.

0 голосов
/ 29 апреля 2011

Мне кажется, что вы извлекаете все контакты, создаете 7000 ContactViewDefault объекты и пролистывать их. Попробуйте получить 10 контактов (с подкачкой страниц) перед их преобразованием в ContactViewDefault.

...