LLBL Linq переменное количество соединений
Я использую синтаксис Linq для LLBL. У меня есть необходимость присоединиться к определенной таблице разное количество раз. У меня есть запрос, который работает, но я пытаюсь сделать это быстрее. У меня есть сырой SQL, но я не уверен, как его кодировать в Linq или даже могу. Вот упрощенный пример:
SELECT Parent.SomeColumn
FROM
ParentTable Parent
INNER JOIN ChildTable Child1 ON Child1.ParentID = Parent.ID
INNER JOIN ChildTable Child2 ON Child2.ParentID = Parent.ID
WHERE
Child1.TypeColumn = 'Type1'
AND Child2.TypeColumn = 'Type2'
Это достаточно просто сделать, но я хочу что-то, что будет обрабатывать Child3, Child4 и т. Д. Другими словами, я не буду знать количество соединений ChildTable во время компиляции.
Мой исходный код запрашивал ParentTable, а затем выполнял подзапросы EXISTS для ChildTable каждый раз, когда мне требовалось объединение. Это работает, но я вижу, что выполнение запроса выше займет около 1/4 времени. У меня есть некоторые обновления пользовательского интерфейса в реальном времени, которые увидят значительное улучшение, если я смогу сделать эту работу.
Я знаю, что было бы очень легко, если бы я строил SQL-запрос в коде, но я действительно хотел бы положиться на LLBL, чтобы сгенерировать это для меня.
1 ответ
Я не знаю конкретно о LLBL, но в EF или LINQ to SQL я был бы очень удивлен, если бы следующее не приводило к чему-то очень похожему на необработанный SQL-запрос, который вы разместили:
int numJoins = ...
IQueryable<ParentTable> parents = ...
for (var i = 0; i < numJoins; i++) {
var typeI = "Type" + (i + 1);
var typeIChildren = children.Where(ch => ch.TypeColumn == typeI);
parents = parents.Join(typeIchildren, parent => parent.Id, child => child.ParentId, (parent, child) => parent);
}
return parents.Select(p => p.SomeColumn);