Привет, Игорь
Все мне в linq2db нравится и скорость и SQL которые он генерит, но осталось одно но, на которое я развожу руками когда меня спрашивают как использовать linq2db:
LoadWith работает чудесно, но все-таки, то, что выходит из подобного, не всем нравится
LinqToDB.Common.Configuration.Linq.AllowMultipleQuery = true;
using (var db = GetDataContext(context))
{
var q =
from p in db.Parent
where p.ParentID < 3
select new
{
p.Value1,
Children = p.Children.ToList()
};
var res = q.ToList();
}
Естественно на каждую запись запускается дополнительный запрос.
Сидел, думу думал и видится мне два варианта решения (пока Take и Skip опускаем):
Загрузить всех Parent на клиент, обязательно с небходимым ключом для ассоциации
Запустить BulkCopy и вставить уникальные ключи во временную таблицу (если записей очень много)
Загрузить Children с Join на временну таблицу (или WHERE IN)
Прокинуть загруженных детей в Parent записи на клиенте
Загрузить всех Parent на клиент, обязательно с небходимым ключом для ассоциации
Каким то "веселым" способом выделить expression выборки Parent ключей — идей как это сделать пока не появилось
Сделать join детей на этот выделенный expression
Прокинуть загруженных детей в Parent записи на клиенте
Смотрел я в код, чесал репу, но так и не разобрался, погиб в Transform
. Видать действительно надо пол года пописать провайдер чтобы научиться ТАК манипулировать деревьями выражений.
И с Новым Годом!