Использование классов Linq2sql в качестве источника данных

отредактировано May 2009 Раздел: FastReport .NET
Если в качестве источника данных зарегистрировать сущность LINQ2SQL, имеющую ссылки (ассоциации) на собственный тип (обычная древовидная структура справочника), то при регистрации система виснет, и начинает "съедать" память. Передача ноля в параметре maxNestingLevel приводит к тормозам при регистрации и отсутствию распознанных свойств у источника данных в итоге.

Или снова я что-то делаю не так...

UPD: к такому эффекту приводит использование реального источника. Использование фиктивного (списка нужного типа с одним элементом) и указание правильного значения maxNestingLevel позволяет открыть дизайнер. В связи с чем вопросы:
1. Судя по всему в режиме дизайна происходит перечисление данных. Зачем? Как правило, для дизайна нужна только структура.
2. На что и как влияет параметр maxNestingLevel? Из документации не очень понятно.

Комментарии

  • отредактировано 01:49
    Здравствуйте,

    1) перечисление данных происходит, если не удалось получить полную схему (напр., св-во имеет значение null, и раскрыть его не получается). В этом случае берется следующая запись из IEnumerable, и так далее, пока схема не будет заполнена.
    2) этот параметр влияет на глубину вложенности подклассов. Если в структуре есть кольцевые ссылки, то их количество (вложенность) также ограничивается этим параметром.
  • отредактировано May 2009
    Хм...

    1. А все таки - зачем? Ведь для построения полной схемы достаточно узнать тип элементов IEnumerable. А в случае свойства типа Object все равно нельзя гарантировать, что при построении отчета там будет объект того же типа, что и при дизайне. Generic вариант метода RegisterData вообще избавил бы от необходимости получать элементы коллекции.

    2. Что есть "глубина вложенности подклассов"? Пока что получается, что в передача неправильного значения приводит к зависанию. Пара примеров с различной глубиной вложенности всё прояснили бы :)

    Спасибо за оперативность.
  • отредактировано 01:49
    1. Свойство может быть, например, типизированной коллекцией. Как узнать тип ее элемента? Только взяв первое значение коллекции.
    2. Пришлите свой пример, который зависает - буду разбираться.
  • отредактировано 01:49
    AlexTZ написал: »
    1. Свойство может быть, например, типизированной коллекцией. Как узнать тип ее элемента? Только взяв первое значение коллекции.
    Да, это понятно. Моя проблема судя по всему кроется во втором пункте.
    AlexTZ написал: »
    2. Пришлите свой пример, который зависает - буду разбираться.
    К сожалению, прислать данные, на которых это воспроизводится у меня вряд ли получится. По сути, это LINQ2SQL сущность, имеющая шесть различных ссылок на собственный тип, и около 70000 объектов этого класса, и возможна ситуация, когда у всех объектов некоторые ссылки будут равны null. Указание ноля в параметре maxNestingLevel приводит к тормозам при регистрации источника данных и отсутствию распознанных свойств у источника данных в итоге, указание любого другого значения приводит к еще большим тормозам (я не дождался результата). На малых объемах данных эффект не воспроизводится.

    Давайте так - на что будут влиять различные значения maxNestingLevel если использовать в качестве источника данных Northwind.Employees через LINQ2SQL? Например, указав 5 и больше можно всё повесить.
  • отредактировано 01:49
    Рассмотрим такой класс:
        public class Category
        {
          public string Name;
          public string Description;
          public List<Product> Products;
          public Category ParentCategory;
        }
    

    При его регистрации с указанием maxNestingLevel = 5 получаем вот это:

  • отредактировано 01:49
    Ясно, спасибо.

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.