LinqToSQL запрос нагрузки с производительностью - PullRequest
1 голос
/ 17 ноября 2010

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

Вот что у меня есть для DataLoadOptions:

        options.LoadWith<Support>(p => p.PostBase);
        options.LoadWith<Support>(p => p.PostMaterial);
        options.LoadWith<Support>(p => p.PostPosition);
        options.LoadWith<Support>(p => p.PostSize);
        options.LoadWith<Support>(p => p.PostType);
        options.LoadWith<Support>(p => p.Signs);
        options.LoadWith<Support>(p => p.SupportComments);
        options.LoadWith<Support>(p => p.SupportInspections);
        options.LoadWith<Support>(p => p.SupportPhotos);
        options.LoadWith<Sign>(p => p.SignBacking);
        options.LoadWith<Sign>(p => p.SignComments);
        options.LoadWith<Sign>(p => p.SignCondition);
        options.LoadWith<Sign>(p => p.SignDelineator);
        options.LoadWith<Sign>(p => p.SignFace);
        options.LoadWith<Sign>(p => p.SignIllumination);
        options.LoadWith<Sign>(p => p.SignToSignObstructions);
        options.LoadWith<Sign>(p => p.UniformTrafficControlCode);
        options.LoadWith<SignToSignObstruction>(p => p.SignObstruction);

Я думаю, что это даст хорошее объяснение моего графа объектов.Я пытаюсь запросить объекты поддержки, которые соответствуют определенным критериям поиска (возможно, кто-то хочет поддержки с типом записи бла).

Если я попытаюсь просто отозвать все Поддержка, я получу около 2200 Поддержек, и это займет 17 000 запросов.

Я попытался группировать решение, упомянутое в другом вопросе, но мне интересно, если яЯ делаю это неправильно или моя ситуация слишком сложна.Я удалил критерии поиска и просто попытался вернуть все Поддержки.Это приводит к примерно 21 тыс. Запросов и возвращает около 3000 поддержек.Вот мой запрос:

                var group =
                from support in roadDataContext.Supports
                join sign in roadDataContext.Signs on support.SupportID equals sign.SupportID
                group sign by sign.Support
                into signGroup
                select signGroup;

Я просто что-то упустил?Спасибо.

1 Ответ

2 голосов
/ 23 марта 2011

Мы сделали ту же ошибку с нашим слоем данных L2S.Наши варианты загрузки в некоторых случаях смешны.Это был тяжелый урок.

Это называется проблемой SELECT N + 1.1 для родительского объекта и N для числа связанных объектов, загружаемых с нетерпением.Вы ожидаете, что L2S будет достаточно умным и получит все это одним гигантским запросом, но, к сожалению, это не так.Он создаст один гигантский запрос, который сообщает ему идентификаторы ассоциаций для загрузки, а затем один за другим извлекает эти ассоциации.

Возможно, лучший способ обойти это использовать проекцию, чтобы ваш запрос LINQ возвращал новый объект, а не сущность.Например:

var fooDtos = from foo in db.Foo
              where foo.bar == "What a great example"
              select new fooDTO { FooName = foo.Name, FooBar = foo.Bar };

Этот запрос возвращает IEnumerable вместо IQueryable .Это имеет два преимущества.Прежде всего, вы указываете L2S, какие столбцы нужно извлекать, поэтому он не выполняет SELECT *.Кроме того, вам больше не нужны DataLoadOptions, поскольку вы можете запросить любую таблицу в запросе и выбрать любую из таблиц для генерации DTO.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...