Форум программистов, компьютерный форум, киберфорум
Наши страницы
LINQ
Войти
Регистрация
Восстановить пароль
 
ArminAmarr
0 / 0 / 1
Регистрация: 20.09.2015
Сообщений: 1
#1

GroupJoin генерирует множество запросов к БД - LINQ

21.09.2015, 00:49. Просмотров 381. Ответов 1
Метки нет (Все метки)

Попробовал использовать LinqConnect to PostgreSQL от DevArt, написал простой GroupJoin и очень удивился результатам в dbMonitor.

C#
1
2
3
4
5
6
7
context.Cities.GroupJoin(
    context.Unis, 
    c => c.Id, 
    u => u.IdCity, 
    (c, us) => new {c.Name, Names = us.Select(u => u.Name)})
    .ToList()
    .ForEach(x => Console.WriteLine(x.Name + x.Names.DefaultIfEmpty().Aggregate((a, b) => a + ", " + b)));
Для каждого города выполняется запрос
SQL
1
2
3
SELECT t1."name"
FROM public.uni t1
WHERE :np0 = t1.id_city
Подскажите, плз, можно ли как-то изменить эту конструкцию так, чтобы на сервере выполнился 1 запрос?

Добавлено через 6 часов 2 минуты

Добавлено через 1 минуту
Хорошее решение найдено на http://stackoverflow.com/questions/5...ension-methods
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var q = context.Cities.SelectMany
(
    с => context.Unis.Where(u => с.Id == u.IdCity).DefaultIfEmpty(),
    (c, u) => new {
        CityName = c.Name,
        UniName = (u != null ? u.Name : "None")
    }
);
 
foreach (var item in q)
    Console.WriteLine(item.CityName + ": " + item.UniName); 
            Console.ReadLine();
 
        }
    }
В этом случае генерируется 1 запрос к БД
SQL
1
2
3
4
5
6
7
SELECT t1."name" AS "Name", 
    (CASE 
        WHEN NOT (t2.id IS NULL) THEN t2."name"
        ELSE :p0
     END) AS "C1"
FROM public.city t1
LEFT OUTER JOIN public.uni t2 ON t1.id = t2.id_city
Странно что на всех форумах и в книгах предлагают использовать GroupJoin, хотя он явно уступает в производительности.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2015, 00:49
Я подобрал для вас темы с готовыми решениями и ответами на вопрос GroupJoin генерирует множество запросов к БД (LINQ):

Объясните механику работы селектора GroupJoin
Прочел тут https://msdn.microsoft.com/ru-ru/library/bb534297%28v=vs.110%29.aspx...

Найти множество, которое генерирует пространство
Обозначим V как множество всех реальных матриц типа 2х3 таких, что сумма всех...

Вирус на Джумле генерирует множество страниц, которые индексируются
Пример: http://krovlikubani.ru/e09f8we2 Где запрятан вирус, не понятно, но уже...

Множество запросов
День добрый Столкнулся в очередной раз с проблемой гибкости приложения....

Множество запросов mysqli
Есть допустим необходимость, записать в БД сразу много записей. Если я делаю...

Множество ajax запросов
Всем привет! Существует ли какое-нибудь ограничение на количество ajax...

1
kolorotur
Эксперт .NET
9926 / 8312 / 2042
Регистрация: 17.09.2011
Сообщений: 14,319
30.09.2015, 10:24 #2
ArminAmarr, у вас проблема была в том, что после выполнения запроса (ToList) вы делаете еще и выборку по связной коллекции Names, в итоге из-за ленивой загрузки для каждой строки выполнялся еще один запрос в базу для извлечения имен.
При создании запроса можете сразу указать, чтобы хваталась связная таблица:
C#
1
context.Cities.Include(c => c.Names).GroupJoin(...
Тогда будет один запрос.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.09.2015, 10:24
Привет! Вот еще темы с решениями:

Как сократить множество запросов?
Возможно ли сократить каким-нибудь образом эти запросы? $a =...

Как отправить множество запросов серверу с определенным интервалом
У меня в скрипте есть цикл, который должен отправить 5000 запросов серверу. На...

Множественная выборка из базы, стоит ли создавать множество однотипных запросов
Прошу подсказать, как правильно стоит делать. Из существующей базы необходимо...

Нажатие на ссылку созданную Ajax.ActionLink() вызывает множество запросов
Пишу форму по заполнению медицинского осмотра. Для заполнения поля с Id ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru